/*
思路:o(n)的算法,只有当可以更改输入的数组时候才可用
从数组中次数超过一半的数字得到启发。
就是用快速排序的思想,找到第K大的数,那么左边都是比它小的数了
*/
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int start=0, end=input.size()-1;
int index=Partition(input, start, end);
while(index!=k-1)
{
if(index>k-1)//轴大于k
{
end=index-1;
index=Partition(input, start, end);
}
else//轴小于k
{
start=index+1;
index=Partition(input, start, end);
}
}
vector<int> ans;
for(int i=0; i<k; i++)
ans.push_back(input[i]);
return ans;
}
int Partition(vector<int>& input, int start, int end)//快速排序中对一段数按轴进行处理
{
int index=start;//或者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[small], input[index]);
}
}
++small;
swap(input[small], input[end]);
return small;
}
};
[剑指Offer]最小的K个数
最新推荐文章于 2018-10-02 20:58:39 发布