給定陣列中找到最大的兩個數

weixin_34148456發表於2018-07-19

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;
    }

相關文章