件名の説明:
未ソート配列の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≤配列の長さができます。
アイデアの分析:
アイデア:トラバーサルは、それがある場合、それは、それが下降されている場合、それはNUMS返され、[NK] NUMS戻される昇順にソート+ [K-1]
クラスソリューション{ パブリックstatic int型findKthLargest(INT [] NUMS、INT K){ は、Arrays.sort(NUMS)。 戻りNUMS [nums.length - K]。 } }
時間の複雑さ:O(Nlogn)
宇宙複雑:O(1)
二つのアイデア:プライオリティキュー、最大または最小ヒープ・スタック
LEN素子のアレイが存在すると仮定すると。
最小のスタックは:lenの要素)は(LENポップ、最小ヒープに置かれており、 -最小限の要素はスタックこの時のk個の要素、kは、配列要素はk番目の最大要素でスタックのトップであります。
コードの実装:
クラスソリューション{ //使用最小堆 パブリックstatic int型findKthLargest(INT [] NUMS、INT K){ int型のlen = nums.length。 優先度つきキュー<整数>のminheap =新しい優先度つきキュー<>(LEN、Comparator.comparingInt(O - > O))。 以下のために(INT I 0 =; I <LEN; I ++){ minHeap.add(NUMS [I])。 } のための(INT J = 0; J <lenの- K、J ++){ minHeap.poll()。 } )(minHeap.peekを返します。 } }
最大ヒープ:LEN要素が最大スタックに配置され、次いで、ポップ()K - 1つの要素、第kのため - 1つの大要素がポップアップされ、その後、最大スタックアレイ要素は、スタックの最上位でありますk番目の最大の要素。
コードの実装:
クラスソリューション{ //使用最大堆 パブリックstatic int型findKthLargest(INT [] NUMS、INT K){ int型のlen = nums.length。 優先度つきキュー<整数>のminheap =新しい優先度つきキュー<>(LEN、(O1、O2) - > O 2 - O1)。 以下のために(INT I 0 =; I <LEN; I ++){ minHeap.add(NUMS [I])。 } のための(INT J = 0; J <K - 1、J ++){ minHeap.poll()。 } )(minHeap.peekを返します。 } }
時間の複雑さ:O(n)は、
宇宙複雑:O(n)は、