力扣练习第四十天——数组中的第k个最大元素
题目大致如下:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例一:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例二:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
链接来源于LeetCode:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
大致思路:
最开始想采取直接排序后返回的方式,可以采用库里的排序函数;
后面参考了一个快速排序的方法,对数组进行划分,判断划分的边界元素位置mid是否为第k大的数(k - 1)。
代码如下:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int lo = 0, hi = nums.size() - 1, mid = 0;
while (lo <= hi) {
mid = partition(nums, lo, hi);
if (mid == k - 1) return nums[mid];
else if (mid > k - 1) hi = mid - 1;
else lo = mid + 1;
}
return -1;
}
int partition(vector<int>& nums, int lo, int hi) {
int r = hi,l = lo + 1,;
swap(nums[lo], nums[(lo + hi) / 2]);
int bound = nums[lo];
while (l <= r) {
while (l < hi && nums[l] >= bound) l++;
while (nums[r] < bound) r--;
if (l < r) swap(nums[l++], nums[r--]);
else break;
}
swap(nums[lo], nums[r]);
return r;
}
};
结果: