鏈接
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
耗時
解題:30 min
題解:18 min
題意
在數組中找到第 k 大的元素。
思路
快排的思想。
將第一個數作爲基準數,將比基準數大的放在基準數的前面,將比基準數小的放在基準數的後面。然後看 k 是在基準數的前面還是後面,或者正好在基準數的位置。如果正好在基準數的位置,則已經得到了第 k 大元素,直接輸出;如果是在基準數的前面或者後面,則縮小範圍至基準數的前面或者後面,繼續上述操作直至 k 正好是基準數的位置或者等縮小範圍至範圍內僅有一個元素。
最壞情況下是 ,期望是 。
AC代碼
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
if(n == 1) return nums[0];
int l = 0, r = n-1;
int p = l, ans = -1;
while(r-l+1 > 1) {
while(l < r) {
while(l < r && nums[r] <= nums[p]) r--;
while(l < r && nums[l] >= nums[p]) l++;
swap(nums[l], nums[r]);
}
swap(nums[p], nums[r]);
if(k-1 == r) {
break;
}
if(k-1 > r) {
l = r+1;
r = n-1;
p = l;
}
else {
l = 0;
r = r;
p = l;
}
}
return nums[k-1];
}
};