題目:
在未排序的陣列中找到第 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...