0
点赞
收藏
分享

微信扫一扫

pat甲级总结:基于快排思想找到vector的前k大的数

得一道人 2022-03-11 阅读 73

快排:
找left right,然后随机出一个idx放在left中
然后遍历ij双指针,找到不符合的并交换
最后把left和i交换
最后判断i的位置是否满足
输出后k个即可

//
// Created by 009 on 2022/3/6.
//

#include<bits/stdc++.h>
using namespace std;

int findKthLargest(vector<int>& nums, int k) {
    int n=nums.size();
    // 初始化
    int le=0, ri=n-1;
    while(true){
        //快排框架
        int i=le, j=ri;
        int idx = rand() % (ri - le +1) + le;//随机选择pivot
        // 把pivot放在最前
        swap(nums[le], nums[idx]);
        while(i<j){
            //找到不合规的j
            while(i<j&&nums[j]>=nums[le]) --j;
            //找到不合规的i
            while(i<j&&nums[i]<=nums[le]) ++i;
            swap(nums[i], nums[j]);
        }
        // 恢复原位
        swap(nums[i], nums[le]);//nums[le]应处的位置在索引i处

        if(i==n-k) return i;//若恰为倒数第K的位置, 直接返回位置
        else if(i>n-k) ri=i-1;//将查找范围放在该位置左侧
        else le=i+1;//将查找范围放在该位置右侧
    }
}


int main() {
    //找出vector中第k大的数
    vector<int> v = {1, 3, 5, 9, 9, 7, 5, 6, 7};
    int k = 7;
    int myKL = findKthLargest(v, k);
    //找出前k个大的数
    vector<int> ans;
    for(int i = myKL; i < v.size(); i++) {
        ans.push_back(v[i]);
    }
    sort(ans.rbegin(), ans.rend());
    for(int i = 0; i < k; i++) {
        if(i == 0) cout << ans[i];
        else cout << " " << ans[i];
    }
}
举报

相关推荐

0 条评论