[剑指offer]JT29---最小的K个数(靓仔靓女,快进来学习快排讷!)

题目如下

在这里插入图片描述

思路与代码

sort()函数解千愁,面试官不愿回眸

很简单,就是排序然后输出,一定要用快排呀
面试这题就是在考里会不会快排,你若是冒泡排序
面试官可能会问你,“我们这里还缺清洁工,你有没有兴趣?”
快排,c++有封装的函数,我们看看用函数能有多简单?

class Solution {
    
    
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
    
    
        vector<int> ans;
        if(k>input.size()) return ans;
        sort(input.begin(),input.end());
        for(int i=0;i<k;i++){
    
    
            ans.push_back(input[i]);
        }
        return ans;
    }
};

十年磨一剑,快排永争先(手写快排)

用简单语言来描述一下快排
从左边找到一个大于base的数
从右边找到一个小于base的数
如果这两个数的下标不同,就交换两个数,
这样小的数就到了左边。
当两者遍历到了同一个下标,这个下标和base交换,就可以保证base左边的数都比base小,右边的都比base大,这就是我们要的呀!
然后对前k个数排序就好了
这里有一篇快排很详细的博客推荐给大家!!!
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
快速排序法(详解)

class Solution {
    
    
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
    
    
        int n=input.size();
        if(k>n) return vector<int>();
        quickSelect(input,0,n-1,k);
        return vector<int>(input.begin(),input.begin()+k);
    }
    void quickSelect(vector<int> &input,int left,int right,int k){
    
    
        if(left>=right) return ;
        int l=left,r=right,base=input[left];
        while(l<r){
    
    
            while(input[r]>=base&&l<r){
    
    
                r--;
            }
            while(input[l]<=base&&l<r){
    
    
                l++;
            }
            if(l<r){
    
    
                swap(input[l],input[r]);
            }
        }
        input[left]=input[l],input[l]=base;
        if(l>k-1){
    
    
            quickSelect(input,left,l-1,k);
            quickSelect(input,l+1,right,k);
        }
    }
    void swap(int &a,int &b){
    
    
        a^=b;
        b^=a;
        a^=b;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_42136832/article/details/114847418
今日推荐