劍指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);//遞歸右邊
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章