题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
1.直接sort,然后找前K个
2.快速排序的思想,利用partition分割函数找中轴下标,因为每次分割都是把小于中轴的放左面,大于的放右面,下标找到k就停止找,这个时候前K个就是最小的k个数
code
class Solution {
public:
//1.直接sort,然后找前K个
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int >res;
if(input.size()==0||k==0||input.size()<k)
return res;
sort(input.begin(),input.end());
for(int i=0;i<k;++i)
res.push_back(input[i]);
return res;
}
//2.快速排序的思想,利用partition分割函数找中轴下标,因为每次分割都是把小于中轴的放左面,大于的放右面,
//下标找到k就停止找,这个时候前K个就是最小的k个数
int partition(vector<int>&input,int begin,int end){
int left=begin;
int right=end;
int pivot=input[left];
while(left<right){
while(left<right&&input[right]>=pivot){
right--;
}
input[left]=input[right];
while(left<right&&input[left]<=pivot){
left++;
}
input[right]=input[left];
}
input[left]=pivot;
return left;
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int >res;
if(input.size()==0||k==0||input.size()<k)
return res;
int begin=0;
int end=input.size()-1;
int midIndex=partition(input,begin,end);
while(1){
if(midIndex==k-1){
break;
}else if(midIndex<k-1){
begin=midIndex+1;
}else{
end=midIndex-1;
}
midIndex=partition(input,begin,end);
}
for(int i=0;i<k;++i)
res.push_back(input[i]);
return res;
}
};