力扣刷题(347. 前 K 个高频元素)快速排序

该题使用快速排序(优化后的逻辑)来实现了去排序查找的功能。

快排的思想,用一个while循环每次去在区间中寻找枢纽值,然后将枢纽值左边的区间调用递归,改变low值为pivot+1,进行下一次循环,知道low>=high.

寻找pivot:采用三值取中的思想,取左右边界和中间的三个数中的中间值作为枢纽值,将枢纽值放到数组的左边界,然后用于一个临时变量来存储枢纽值,下面就是一个while循环,不断的取更改low和high值,最后将low位置的值赋值为pivot值,保证枢纽值左边的为小于枢纽值,右边的大于枢纽值。最后返回枢纽位置。

class Solution {
public:
    vector topKFrequent(vector& nums, int k) {
        unordered_map check;
        for(auto &k:nums)++check[k];//初始化哈希表
        vector> vals(check.begin(),check.end());//利用哈希表初始化数组
        quick_sort(vals,0,vals.size()-1,k-1);
        vectorans(k,0);
        for(int i=0;i>& vals,int low,int high,int target)
    {  
        while(lowtarget)break;//我只需要对前target进行排序,所以大于的部分可以不管
            low=pivot+1;//下一次循环的时候find过程其实就是对右半边进行排序,递归的过程相对消耗资源
        }
    }

    int find_pivot(vector>& vals, int low,int high)//寻找枢纽
    {
        int mid=low+(high-low)/2;
        if(vals[low].second=vals[high].second)
                --high;
            vals[low]=vals[high];
            while(low

你可能感兴趣的:(力扣刷题,leetcode,算法,c++)