タイトル:
ソートされていない配列で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> (); for(int num: nums ){ if(heap.size()<k){ // ヒープ内の要素 の数はk未満で、ヒープに直接含まれます 。heap.add(num); } else if(heap.element()<num){ // ヒープの一番上の要素が新しい要素より少なく、ヒープの一番上がポップされ、新しい要素が追加され ヒープにます.poll(); heap.add(num); } } return heap.element(); }