题解 | #寻找第K大#

寻找第K大

https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

class Solution {
public:
  // 注意快速排序是要升序还是降序
  // 降序的话,i,j重合时的下标若为 k - 1,即为第k大的数字
  // 升序的话,i,j重合时的下标是第 i + 1 小的数字
    int quick_sort(vector<int>& vec, int begin, int end, int k){
        int tmp = vec[begin];	// 选择基准数,这里选的是下标为begin的数字(vec中第一个元素)
        int i = begin, j = end;
        while(i != j){	// i,j不相等时进入循环
            while(vec[j] <= tmp && j > i) --j;	// j从右往左找比基准数大的数字
            while(vec[i] >= tmp && j > i) ++i;	// i从左往右找比基准数小的数字
            if(j > i){	// 如果 j > i,则一直进行交换,直到i,j重合,此时i左边都是比基准数大的数
                int t = vec[i];
                vec[i] = vec[j];
                vec[j] = t;
            }
        }
	  // 此时i,j重合处的元素比基准数大,交换基准数与此元素
        vec[begin] = vec[i];
        vec[i] = tmp;
	  // 如果i是第k大的数,直接返回
        if(i == k - 1) return vec[i];
	  // 如果i比 k - 1大,说明第k大的数在i的左边,只需要递归i左边的数列
        if(i > k - 1) return quick_sort(vec, begin, i - 1, k);
	  // 如果i比 k - 1小,说明第k大的数在i的右边,只需要递归i右边的数列
        if(i < k - 1) return quick_sort(vec, i + 1, end, k);
	  // 最后的 return -1;是为了保证函数结构的准确性,实际不会运行这一句
        return -1;
    }
    int findKth(vector<int> a, int n, int K) {
        return quick_sort(a, 0, n - 1, K);
    }
};

全部评论

相关推荐

头像
10-27 15:50
门头沟学院 Java
想进开水团喝开水:有一种店 只能外卖 不能堂食 你猜为什么
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务