在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数

题目描述:

求无序数组中任意两个元素的最大差值,以及存在最大差值的组别数.

输入:

输入包含两行,第一行输入一个整数n;第二行n个正整数,用空格隔开.

输出:

输出为一行,包含最大差值,以及存在组别数.

样例输入:

4

4  1  2  1

输出:

3  2

一种实现代码如下(Java版):

 1 import java.util.Scanner;
 2 /**
 3  * 在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数
 4  * @author JiaJoa
 5  *
 6  */
 7 public class Main{
 8     public static void main(String args[]){
 9         Scanner cin = new Scanner(System.in);
10         int n = cin.nextInt();
11         int[] v = new int[n];
12         for(int i=0;i<n;i++){
13          v[i] = cin.nextInt();
14         }
15         getResult(n,v);
16         cin.close();
17     }
18
19     public static void getResult(int n,int[] b){
20         int min = Integer.MAX_VALUE;  //记录最小值
21         int max = Integer.MIN_VALUE;  //记录最大值
22         int minCount = 0; //记录最小值的个数
23         int maxCount = 0; //记录最大值的个数
24         for(int i=0;i<n;i++){
25             if(b[i]==max){
26                 maxCount++;
27             }
28             if(b[i]>max){
29                 max = b[i];
30                 maxCount = 1;
31             }
32
33             if(b[i]==min){
34                 minCount++;
35             }
36             if(b[i]<min){
37                 min = b[i];
38                 minCount = 1;
39             }
40         }
41
42         int maxB = max - min;  //数组中两个数的最大差值
43         int count = maxCount*minCount;  //存在最大差值的组数
44
45         System.out.println(maxB+" "+count);
46     }
47 }
时间: 2024-11-13 21:20:24

在O(n)时间复杂度内求无序数组中任意两个元素的最大差值,以及存在的组数的相关文章

给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)

第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] args) { int[] arr = new int[] { 2, 5, 12, 8, 6, 90, 34, 10, 10 }; sort(arr); Arrays.stream(arr).forEach(x -> System.out.print(x + " ")); //计算

求数组中任意两个数之间所有数字的和

303. Range Sum Query - Immutable   求数组中任意两个数之间所有数字的和 QuestionEditorial Solution My Submissions Total Accepted: 37248 Total Submissions: 146945 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j),

在排序的数组中交换两个元素

如题,在一串已经排序好的数中,交换了两个元素.例如: nums[] = {1,2,3,4,5,6,7,8,9,10} 交换两个元素(例如交换数字5和9)后: nums[] = {1,2,3,4,9,6,7,8,5,10} 问题是怎么在数组中找到这两个元素? 思路 假设交换的两个元素为x和y,且x < y.其他的数为Ni.那么问题可以表示为: nums[] = {N1 , N2 , N3 , Ni , x , Ni+2 , ... , y , ...,Nm } 交换x和y后 nums[] = {N

给出一个数组和一个目标值,如果数组中任意两个数字的加和等于目标值,输出这两个位置

一般的做法(我自己也这样做了哈哈) public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[] { i, j }; } } } throw new IllegalArgumentExceptio

[BC]求数组中任意两个数的公约数,,多种情况取最大值

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> using namespace std; int main() { int t,i,c,j,n,x,max,k; int a[100005]; scanf("%d",&t); for(j=1;j<=t;j++) {

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

快速查找无序数组中的第K大数?

1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高效算法. 还记得我们快速排序的思想麽?通过“partition”递归划分前后部分.在本问题求解策略中,基于快排的划分函数可以利用“夹击法”,不断从原来的区间[0,n-1]向中间搜索第k大的数,大概搜索方向见下图: 2.参考代码: 1 #include <cstdio> 2 3 #define sw

【算法】数组与矩阵问题——找到无序数组中最小的k个数

1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶的元素是最小的k个数中最大的那个. 6 * 2.接下来,遍历整个数组,遍历过程中看当前数是否比堆顶元素小: 7 * 如果是,就把堆顶元素替换成当前的数,然后从堆顶的位置调整整个堆,让替 8 * 换操作后堆的最大元素继续处在堆顶的位置: 9 * 如果不是,则不进行任何操作,继续遍历下一个数: 10 *

求一无序数组中第n大的数字 - 快速选择算法

逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) 1 #include <vector> 2 #include <iostream> 3 #include <stdexcept> 4 #include <cstdio> 5 6 const int QS_EERRMSG_LEN = 256; 7 8 9 /** 10 * 快速选择求无序数组