Q40配列の最小K数

配列内の最小のk数

タイトル

n個の整数を入力して、最小のK数を見つけます。たとえば、4、5、1、6、2、7、3、8の8つの数字を入力すると、最小の4つの数字は1、2、3、4になります。

アイデア

アイデア1:

高速ソートパーティション関数を使用して最初に配列をソートし、k-1の周りの配列がソートされるようにします。

最初のk桁を出力します。

アイデア2:

大量のデータを処理する場合、最大数のk要素のマルチセットを使用して、セット内の数を更新するかどうかを継続的に判断できます。

達成する

class Solution {
public:
    int partition(vector<int>& numbers, int left, int right)
    {
        if(numbers.empty() || left<0 || right>=numbers.size() || left>right)
            return -1;
        int pivot = numbers[left];
        while(left<right)
        {
            while(left<right && numbers[right]>=pivot)
                --right;
            numbers[left] = numbers[right];
            while(left<right && numbers[left]<=pivot)
                ++left;
            numbers[right] = numbers[left];
        }
        numbers[left] = pivot;
        return left;
    }
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> result;
        if(input.empty() || k<=0 || input.size()<k)
            return result;
        int left = 0;
        int right = input.size()-1;  //记得是减1
        int pindex = partition(input, left, right);
        int mark = k-1;
        while(pindex!=mark)
        {
            if(pindex<mark)
            {
                left = pindex+1;
                pindex = partition(input, left, right);
            }
            else
            {
                right = pindex-1;
                pindex = partition(input, left, right);
            }
        }
        for(int i=0; i<k; ++i)
            result.push_back(input[i]);
        return result;
    }
};
元の記事を58件公開 11 件を獲得 30,000回以上の閲覧

おすすめ

転載: blog.csdn.net/mhywoniu/article/details/105606288