LeetCode_215_数组中的第K个最大元素
廖家龙 用心听,不照做

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
给定整数数组 nums 和整数 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

提示:
1. 1 <= k <= nums.length <= 10^4
2. -10^4 <= nums[i] <= 10^4

解法1:快速选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {

int l = 0,r = nums.size() - 1,target = nums.size() - k;

while (l < r) {

int mid = quickSelection(nums,l,r);

if (mid == target) return nums[mid];

if (mid < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}

return nums[l];
}

//快速选择
//快速选择的实现和快速排序相似,不过只需要找到第k大的值即可,不需要对其左右再进行排序
//与快速排序一样,快速选择一般需要先打乱数组,否则最坏情况下时间复杂度为O(n^2)
int quickSelection(vector<int>& nums,int l,int r) {

int i = l + 1,j = r;

while (true) {

while (i < r && nums[i] <= nums[l]) {
++i;
}

while (l < j && nums[j] >= nums[l]) {
--j;
}

if (i >= j) break;

swap(nums[i],nums[j]);
}

swap(nums[l],nums[j]);
return j;
}
};

解法2:堆排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//大顶堆排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {

//定义一个大顶堆
priority_queue<int, vector<int>, less<int> > q;

for (int i = 0; i < nums.size(); ++i) q.push(nums[i]);

for (int i = 0; i < k-1; ++i) q.pop();

return q.top();
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//小顶堆排序
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {

//定义一个小顶堆
priority_queue<int, vector<int>, greater<int> > q;

for (int i = 0; i < nums.size(); ++i) q.push(nums[i]);

for (int i = 0; i < nums.size()-k; ++i) q.pop();

return q.top();
}
};

解法3:暴力解法

1
2
3
4
5
6
7
8
9
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {

sort(nums.begin(),nums.end());

return nums[nums.size() - k];
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {

vector<int> numsSort = quick_sort(nums,0,nums.size() - 1);

return numsSort[numsSort.size() - k];
}

//快速排序:左闭右闭
vector<int> quick_sort(vector<int> &nums,int l,int r) {

if (l > r) return {};

int first = l,last = r,key = nums[first];

while (first < last) {

while (first < last && nums[last] >= key) {
--last;
}
nums[first] = nums[last];

while (first < last && nums[first] <= key) {
++first;
}
nums[last] = nums[first];
}

nums[first] = key;
quick_sort(nums,l,first - 1);
quick_sort(nums,first + 1,r);

return nums;
}
};