215 Kth Largest Element in an Array

---恢复内容开始---

题目:在一个整数序列中寻找第k大的元素。

注意几个问题:

1)k的取值:是不变的啊! 不会因为递归时在privot的左边或者右边寻找而改变,因为nums的长度n是不变的,元素的下标也是不变的;

2)partition函数递归调用自己时是要加return的!不然会报错。

class Solution {
public:
    
     int partition(vector<int>& nums, int k, int l, int r){
       int n = nums.size();
        swap(nums[l],nums[rand()%(r-l+1)+l]);   //生成随机数
        int p = nums[l];
        
        //nums[l+1...i) <=v ; nums(j...r] >=v i和j 是需要考察的元素,所以是开区间
        int i = l+1, j = r;     //初始定义区间为空
        while(true){
            while(i<=r && nums[i]<p)
                i++;
            while(j>=l+1 && nums[j]>p)
                j--;
            if(i>j) break;
            swap(nums[i], nums[j]);
            i++;
            j--;
        }
        swap(nums[l], nums[j]);
        
        if(j == n-k) return nums[j];
        else if(j < n-k) return partition(nums, k, j+1,r);
        else return partition(nums, k, l, j-1);
        
    }
    
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(NULL));
        int n = nums.size();
        return partition(nums, k, 0, n-1);
        
    }

};

猜你喜欢

转载自www.cnblogs.com/Bella2017/p/10128957.html