欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

给定数组中找到最大的两个数

程序员文章站 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;
    }