陣列中的第K個最大元素

2021-10-03 21:27:16 字數 1112 閱讀 4161

題目:

在未排序的陣列中找到第 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 ≤ 陣列的長度。

解題思路:

這個是個典型的 top k 問題,而且題目裡面沒有說明資料量的大小或限定的記憶體,那麼直接用堆排序秒了就行。

思路是建立乙個小頂堆,將所有陣列中的元素加入堆中,並保持堆的大小小於等於 k。這樣,堆中就保留了前 k 個最大的元素。這樣,堆頂的元素就是正確答案。

向大小為 k 的堆中新增元素的時間複雜度為 o(log k),我們將重複該操作 n 次,故總時間複雜度為 o(n*log k)

貼出筆者的**:

class

solution

//把堆調整為小頂堆

for(

int i = haep.length /2-

1; i >=

0; i--

)//迴圈遍歷,對每個元素進行調整

for(

int i=k; ireturn haep[0]

;}//單次調整

public

static

void

adjustheap

(int arr,

int i,

int lenght)

if(arr[k]

< temp)

else

}//當for 迴圈結束後,我們已經將以i 為父結點的樹的最大值,放在了 最頂(區域性)

arr[i]

= temp;

//將temp值放到調整後的位置

}}

陣列中的第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個最大元素

題目 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。法一 排序後輸出。法二 優先佇列 堆 法三 利用快速排序的方法。在這裡僅介紹法三,法一法二呼叫庫函式即可。思路 首先,找第k個最大的元素,即是找第n k 1個最小的元素。...

陣列中的第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...