给定数组中找到最大的两个数
程序员文章站
2022-03-13 12:57:17
...
1.在一个给定数组中找到最大的两个数。
思路:用max,max2存较大的数。注意,每次从max和max2中较小的一个数,和数组中的元素比较。以下算法时间复杂度为O(n)
public int[] getMaxTwo2(int[] a){
int max=Integer.MIN_VALUE;
int max2=Integer.MIN_VALUE;
for(int i=0;i<a.length;i++){
if(max<=max2){
if(a[i]>max){
max=a[i];
}
}
else{
if(a[i]>max2){
max2=a[i];
}
}
}
int b[]={max,max2};
return b;
}
2.在给定的数组中找最大的K个数。
解题思路:1)数组先排序,再找最大的k个数。则时间复杂度为nlogn+k 约等于O(nlogn)
2)直接遍历数组,找到最大的元素后,加入set.找到第一个最大元素。再遍历数组,如果数组中的元素已经在Set中(时间复杂度为O(1)),则跳过。否则看是否要更新当前的最大元素。所以总的时间复杂度为n+(n+n1)(k-1)=n*(2k-1) 即O(nk)
所以如果nlogn>nk,则用第二种办法,否则优先排序,再找倒数K个。log2N=logeN/loge2,logeN代表以e为底的N的对数,loge2代表以e为底的2的对数
public Set getMaxK(int[] a,int k){
int n=a.length;
Set<Integer> set=new HashSet<>();
System.out.println(Math.log(n));
if(Math.log(n)/Math.log(2)>k){
//int max=Integer.MIN_VALUE;
// for(int i=0;i<a.length;i++){
// if(a[i]>max){
// max=a[i];
// }
// }
// set.add(max);
for(int m=0;m<k;m++){{
int max2=Integer.MIN_VALUE;
for(int j=0;j<a.length;j++){
if(set.contains(a[j])){
continue;
}
else{
if(a[j]>max2){
max2=a[j];
}
}
}
set.add(max2);
}
}
else{
System.out.println("sort first");
Arrays.sort(a);
for(int l=a.length-1;l>=n-k;l--){
set.add(a[l]);
}
}
return set;
}
上一篇: 35. 搜索插入位置