题目描述
Given an integer array nums
and an integer k
, return the kth
largest element in the array.
Note that it is the kth
largest element in the sorted order, not the kth
distinct element.
Example 1:
Input: nums = [3,2,1,5,6,4], k = 2 Output: 5
Example 2:
Input: nums = [3,2,3,1,2,4,5,5,6], k = 4 Output: 4
Constraints:
1 <= k <= nums.length <= 104
-104 <= nums[i] <= 104
解题思路
【C++】
快排partition
1. 循环
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if (k <= 0 || k > nums.size()) {return -1;}
k--;
int l = 0, h = nums.size() - 1, idx = partition(nums, l, h);
while(idx != k ) {
if(idx < k) {
idx = partition(nums, idx+1, h);
} else {
idx = partition(nums, l, idx-1);
}
}
return nums[k];
}
int partition(vector<int>& nums, int l, int h) {
int pivot = nums[l];
while(l < h) {
while(pivot>=nums[h] && l<h) h--;
nums[l] = nums[h];
while(pivot<=nums[l] && l<h) l++;
nums[h] = nums[l];
}
nums[l] = pivot;
return l;
}
};
2. 递归
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if (k <= 0 || k > nums.size()) {return -1;}
partition(nums, 0, nums.size() - 1, --k);
return nums[k];
}
void partition(vector<int>& nums, int l, int h, int k) {
int pivot = nums[l], low = l, high = h;
while(l < h) {
while(pivot>=nums[h] && l<h) h--;
nums[l] = nums[h];
while(pivot<=nums[l] && l<h) l++;
nums[h] = nums[l];
}
nums[l] = pivot;
if (k == l) {return;}
else if (l > k) {partition(nums, low, l - 1, k);}
else {partition(nums, l + 1, high, k);}
}
};
【Java】
class Solution {
public int findKthLargest(int[] nums, int k) {
if (nums.length == 0 || nums.length < k) { return -1;}
partition(nums, 0, nums.length - 1, --k);
return nums[k];
}
void partition(int[] nums, int low, int high, int k) {
int pivot = nums[low], l = low, h = high;
while(l < h) {
while(pivot >= nums[h] && l < h) h--;
nums[l] = nums[h];
while(pivot <= nums[l] && l < h) l++;
nums[h] = nums[l];
}
nums[l] = pivot;
if (l == k) {return;}
else if (l > k) {partition(nums, low, l - 1, k);}
else {partition(nums, l + 1, high, k);}
}
}
参考文献