在未排序的陣列中找到第 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大的數字,複雜度為o(nlogn)。
也可以用乙個遞減優先佇列來做,當佇列大小小於k時,直接將數字放進佇列,佇列大小等於k時,將佇列頭部數字pop掉。再將當前數字push。
第一種方法排序整個陣列,這多做了很多無用功,因為我們只關心第k大個數,並不關心第k大後面的數的順序如何,我們應該可以對排序方法進行優化以減少複雜度。
o(nlogn)的排序方法主要是快排和歸併,歸併應該是無法優化的了,在這裡我們考慮快排,快排其實就是選乙個數,將比它大的數放一邊,比它小的放一邊。而在這個題中,第k大的數要麼是我們選的那個數,要麼在選的那個數大的一邊或者小的一邊,o(nlogn)的快排是對這兩邊都排序的,但我們其實只需要排一邊的序就可以了,因此這就達到了簡化的目標。排序應該平均需要(n+n/2+n/4+……+1)次讀取,複雜度為o(n)。
class solution
int getpos(vector
& nums, int start , int end , int k)
nums[low] = nums[high];
while(low < high && nums[low] >= choosenum )
nums[high] = nums[low];
}nums[low] = choosenum;
if(low == k - 1)
else
if(low < k - 1)
else
}};
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...
Leetcode215 陣列中的第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...
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 陣...