题目:https://leetcode.com/problems/kth-largest-element-in-an-array/
思路:
找第k大的元素,最简单的方法就是排个序,然后找一下(中位数其实也类似),时间复杂度是O(nlogn)
另一种方案是,参考快速排序的方法找个pivot,然后分三种情况:
- pivot的位置刚好就是第k大的,那么大功告成;
- pivot的位置在k前头,那么就得找pivot后面一堆了;
- pivot的位置在k后头,那么得找pivot前面的一堆;
代码:
class Solution { public: int findKthLargest(vector<int>& nums, int k) { return findKthLargest1(nums, 0, nums.size()-1, k); } int findKthLargest1(vector<int>& nums, int start, int end, int k) { int small = start; int large = end; int pivot = nums[large]; while(true){ while(nums[small] > pivot && small < large) small ++; while(nums[large] <=pivot && small < large) large --; if(small == large) break; swap(nums, small, large); } swap(nums, small, end); if(small == k - 1){ return pivot; } else if (small > k - 1) { return findKthLargest1(nums, start, small - 1, k); } else { return findKthLargest1(nums, small + 1, end, k); } } void swap(vector<int>& nums, int small, int large) { int temp = nums[small]; nums[small] = nums[large]; nums[large] = temp; } };
One reply on “LeetCode 215. Kth Largest Element in an Array”
[…] 设想一下排序后的数列,如果有个元素占了超过半数的位置,那么它肯定也是这个数列的中位数。参考快速排序的思想,可以在O(n)的复杂度找到这个中位数,它也就是要得到的结果。(参考数组第k大数的那个递归方法) […]