题目:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:
1. 使用Partition函数,当其返回的index为k-1时,前k位即最小的k个数字,时间复杂度为O(n),但是会修改原始数组
代码如下:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> result;
int len = input.size();
if(len < 1 || k > len || k <= 0)
return result;
int start = 0;
int end = len - 1;
int index = Partition(input, len, start, end);
while(index != k - 1)
{
if(index < (k - 1))
{
start = index + 1;
index = Partition(input, len, start, end);
}
else
{
end = index - 1;
index = Partition(input, len, start, end);
}
}
for (int i = 0; i < k; i++)
result.push_back(input[i]);
return result;
}
/*---------Partition函数返回的位置之前的元素都小于该位置元素----------*/
int Partition(vector<int> &input, int len, int start, int end)
{
int index = RandomInRange(start, end);
swap(input[index], input[end]);
int small = start - 1;
for(index = start; index < end; index++)
{
if(input[index] < input[end])
{
small++;
if(small != index)
swap(input[index], input[small]);
}
}
++small;
swap(input[small], input[end]);
return small;
}
/*-------生成start到end之间的随机数---------*/
int RandomInRange(int start, int end)
{
int i = rand() % (end - start + 1) + start;
return i;
}
};