leetCode質問バンク215:配列のK番目に大きい要素

タイトル:

  ソートされていない配列でk番目に大きい要素を見つけます。検索する必要があるのは、配列のソート後のk番目に大きい要素であり、k番目の異なる要素ではないことに注意してください。

例1:

入力:[3、2、1、5、6、4]およびk = 2 
出力: 5

例2:

入力:[3、2、3、1、2、4、5、5、6]およびk = 4 
出力: 4

  説明:kは常に有効であり、1≤k≤配列の長さであると想定できます。

 

分析:

  1.最初に考えることができるのは、配列をソートしてから、k番目に大きい数を取ることです。

  2.サイズkの小さな上部ヒープを維持できます。ヒープ内の要素の数がk未満の場合は、直接ヒープに入力します。ヒープ内の要素の数がkの場合、上部要素の値と新しい要素の値を比較します(パイルの上部要素より大きい場合)。次に、パイルの上部をパイルにポップします。それ以外の場合は入りません。

 

コード:

/ ** 
     *時間の複雑さ:サイズkのヒープに要素を追加する時間の複雑さはO(logK)です。この操作をN回繰り返すと、合計時間の複雑度はO(NlogK)になります
     *スペースの複雑度:O( K)
     * / 
    public  int findKthLargest(int [] nums int k){ 
        PriorityQueue <Integer> heap = new PriorityQueue <Integer> ();
         forint num: nums ){
             if(heap.size()<k){        // ヒープ内の要素
数はk未満で、ヒープに直接含まれます                。heap.add(num); 
            } else  if(heap.element()<num){     // ヒープ一番上の要素が新しい要素より少なく、ヒープの一番上がポップされ、新しい要素が追加され
                 ヒープにます.poll();
                heap.add(num); 
            } 
        } 
        return heap.element(); 
    }

 

おすすめ

転載: www.cnblogs.com/guaniu2750/p/12740701.html