题意:找出无序序列里第k大的元素
刚开始我是这样想的:选取序列第0个元素,判断有多少元素比它大、比它小、和它相等,然后缩小问题规模。
然后做完之后,leetcode出现memory limit,占用空间过大,因为这样做选取的元素不定,可能每次缩小问题规模的速度太小,导致每次递归次数多,且每步递归开空间存新的序列的空间花费过大。
后来我进行修改,不再选取序列第0个元素,而是找出序列最小和最大的元素,求其平均数,根据平均数进行判断,这样可以更快的缩小问题规模。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if(nums.size()==1)
return nums[0];
int min,max;
min=max=nums[0];
for(int i=0;i<nums.size();++i){
if(nums[i]>max) max=nums[i];
if(nums[i]<min) min=nums[i];
}
double mid=(min+max)/2.0;
vector<int> left,right;
for(int i=0;i<nums.size();++i){
if(nums[i]>mid) right.push_back(nums[i]);
else left.push_back(nums[i]);
}
if(right.size()>=k){
return findKthLargest(right,k);
}
else if(left.size()==nums.size()) return nums[0];
return findKthLargest(left,k-right.size());
}
};