剑指offer:最小的K个数

题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
快速排序取前K个数

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) 
    {
        if(input.size()==0 || k>input.size()) return{};
        vector<int> res;
        quick_greater(0, input.size()-1, input);
        for(int i = 0;i<k;i++)
        {
            res.push_back(input[i]);
        }
        return res;
    }
    
private:    
//快速排序
    void quick_greater(int left,int right,vector<int>& arr)
    {
        if(left >= right) return;
        int i,j,base,temp;
        i = left,j = right;//左右哨兵
        base = arr[left];//取最左面的数为基准
        while(i<j)
        {
            while(arr[j] >= base && i<j)//从右向左找比基准小的值
            {
                j--;
            }
            while(arr[i] <= base && i<j)
            {
                i++;
            }
            if(i<j)//交换一次比基准大的和比基准小的值
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] =temp;
            }
        }
        //交换基准值和i == j时的值
        arr[left] = arr[i];
        arr[i] = base;
        quick_greater(left,i-1,arr);//递归左边
        quick_greater(i+1,right,arr);//递归右边
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章