美文网首页
给定数组中找到最大的两个数

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

作者: mrjunwang | 来源:发表于2018-07-19 16:30 被阅读0次

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

    相关文章

      网友评论

          本文标题:给定数组中找到最大的两个数

          本文链接:https://www.haomeiwen.com/subject/nkytmftx.html