题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
//用partition的时间复杂度是O(n)
//用set的时间复杂度是0(n*lgk),但是适合海量数据
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> out;
int size = input.size();
if(size == 0 || size < k||k < 1)
return out;
int start = 0;
int end = size - 1;
int index = partition(input, start, end);
while(index != k-1)
{
if(index < k-1)
{
start = index + 1;
index = partition(input, start, end);
}
else if(index > k-1)
{
end = index - 1;
index = partition(input, start, end);
}
}
out.insert(out.begin(),input.begin(),input.begin()+k);
return out;
}
//快排中的partition函数
int partition(vector<int> &numbers,int start, int end)
{
if(start == end)
return start;
int temp = numbers[end];
//跳出迭代的时候start = end
while(start < end)
{
while(start < end && numbers[start] < temp)
++start;
numbers[end] = numbers[start];
while(start < end && numbers[end] >= temp)
--end;
numbers[start] = numbers[end];
}
numbers[end] = temp;
return end;
}
};