LeetCode 215 陣列中的第K個最大元素

2021-08-28 01:22:04 字數 1006 閱讀 8064

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