题目
给定整数数组 nums
和整数 k
,请返回数组中第 k
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
题解
思路1:直接调用 sort()
函数排序,然后返回第 k
大的元素。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
return nums[nums.size() - k];
}
};
(一种面试会挂的写法属于是
思路2:算法导论上的随机快排方法。主要看快排中确认的哨兵是否恰好为第k
个元素,是则直接返回。如果哨兵位置小于k
则处理右半部分数组,大于则处理左半部分数组。
class Solution {
public:
int quickSort(vector<int>& nums, int l, int r, int k){
int ret = randomPartition(nums, l, r);
if(ret == k ) return nums[ret];
return ret < k ? quickSort(nums, ret + 1, r, k) : quickSort(nums, l, ret - 1, k); // 递归当然是quickSort本身
}
int randomPartition(vector<int>& nums, int l, int r){
int i = rand() % (r - l + 1) + l; // 注意当前递归条件下的索引范围
swap(nums[i], nums[r]);
return partition(nums, l, r);
}
int partition(vector<int>& nums, int l, int r){
int i, j;
for(i = l, j = l; i < r; i++){
if(nums[i] >= nums[r]) swap(nums[j++], nums[i]);
}
swap(nums[r], nums[j]);
return j;
}
int findKthLargest(vector<int>& nums, int k) {
srand(time(0));
return quickSort(nums, 0, nums.size() - 1, k - 1);
}
};