配列内の最小の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;
}
};