题意
求一个未排序数组的第k大。
思路
算法1
O(nlogn) 的复杂度。
先排序,然后直接返回第k大即可。
算法2
期望时间为 O(n) ,最坏时间为 O(n2) 的算法。
其基本思想就是基于快排。
首先,我们选择一个观察哨x,将 ≥x 的元素放在x左边,小于x的元素放在x的右边。
然后,如果x此时的位置 pos+1==k ,说明x即为我们要求的元素。
否则, 如果 pos+1>k ,说明x过小,那么要求的元素应该在[l, pos - 1]之间。
否则, 要求的元素在[pos + 1, r]之间。
在算导第三版的P120-P122有对该算法时间复杂度的证明。
代码
class Solution {
public:
//reverse order
int partition(vector<int>& a, int l, int r) {
int x = a[r], i = l - 1;
for (int j = l; j < r; j++) {
if (a[j] >= x) swap(a[++i], a[j]);
}
swap(a[++i], a[r]);
return i;
}
int KthNum(vector<int>& a, int l, int r, int k) {
while (l <= r) {
int m = partition(a, l, r);
if (m + 1 == k) return a[m];
if (m < k) l = m + 1;
else r = m - 1;
}
return 0;
}
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
return KthNum(nums, 0, n - 1, k);
}
};