数组中的第K个最大元素
解题思路:利用快排模板稍作修改即可
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return findx(nums, 0, nums.size()-1, nums.size()-k+1);
}
int findx(vector<int>& nums, int l, int r, int k) {
if(l == r) return nums[l];
int mid = nums[(l + r) / 2];
int i = l-1, j = r+1;
while(i < j) {
do i ++; while(mid > nums[i]);
do j --; while(mid < nums[j]);
if(i < j) swap(nums[i], nums[j]);
}
if(k <= j - l + 1) return findx(nums, l, j, k);
else return findx(nums, j+1, r, k-(j-l+1));
}
};
复杂度:O(n)
复杂度证明:
由于每次减半(非严格),n + n/2 + n/4 + ... + 1,形成等比数列,利用等比数列求和公式
S = a1(1-qn)/(1-q),即(1-2^logn)/(1-2) = n-1,得证。