每天一道Code 215. 数组中的第K个最大元素

在这里插入图片描述
代码思路
最简单的就是排序一遍然后直接输出。时间复杂度就是排序的复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

优化就是使用快排思想,不全部排序,而是当找到的位置正好是要求的位置时,直接返回,否则通过判断K和当前位置的大小判断继续排序左边还是右边。这种思想最坏的情况时间复杂度等于直接排序输出的 O ( n l o g n ) O(nlogn) O(nlogn)。emmm平均时间复杂度不会证,又或者说太麻烦了懒得想。

代码:

class Solution {
    
    
public:
    int quicksort(vector<int> &a,int l,int r,int k){
    
    
        //递归解决问题
        if(l == r) return a[l];
        int i = l,j = r,base = a[l];
        while(i != j){
    
                                  //快排思想
            while(i < j && a[j] >= base) j--;       //左边基准,右边先搜
            while(i < j && a[i] <= base) i++;
            if(i<j) swap(a[i],a[j]);
        }
        swap(a[i],a[l]);
        if(i == k) return a[k];                     //找到后直接返回
        else if(i > k) return quicksort(a,l,i-1,k); //向两边找
        else return quicksort(a,i+1,r,k);
    }
    int findKthLargest(vector<int>& nums, int k) {
    
    
        //寻找第k大
        return quicksort(nums,0,nums.size()-1,nums.size()-k);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_41746268/article/details/108224867