输入整数数组 arr ,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
解法1
class Solution{
public:
vector<int>getLeastNumbers(vector<int>&arr,int k){
vector<int>vec(k,0);
sort(arr.begin(),arr.end());
for(int i=0;i<k;i++)
vec[i]=arr[i];
return vec;
}
}
解法2
class Solution{
public:
vector<int>getLeastNumbers(vector<int>&arr,int k){
vector<int>vec(k,0);
if(k==0)
return vec;
priority_queue<int>Q;
for(int i=0;i<k;i++)Q.push(arr[i]);
for(int i=k;i<(int)arr.size();++i){
if(Q.top()>arr[i]){
Q.pop();
Q.push(arr[i]);
}
}
for(int i=0;i<k;i++){
vec[i]=Q.top();
Q.pop();
}
return vec;
}
}
;
解法3
class Soultion{
int partition(vector<int>&nums,int l,int r){
int privot = nums[r];
int i=l-1;
for(int j=1;j<=r-1;++j){
if(num[j]<=privot){
i=i+1;
swap(nums[i],nums[j]);
}}
swap(nums[i+1],nums[r]);
return i+1;
}
int randomized_partition(vector<int>&nums,int l;int r){
int i=rand()%(r-l+1)+l;
swap(nums[r],nums[i]);
return partition(nums,l,r);
}
void randomized_selected(vector<int>&arr,int l,int r,int k){
if(l>=r)
return ;
int pos= randomized_partition(arr,l,r);
int num= pos-l+1;
if(k==num)return;
else if(k<num)randomized_selected(arr,l,pos-1,k);
else randomized_selected(arr,pos+1,r,k-num);
}
public:
vector<int>getLeastNumbers(vector<int>&arr,int k){
srand((unsigned)time(NULL));
randomized_selected(arr,0,(int)arr.size()-1,k);
vector<int>vec;
for(int i=0;i<k;i++)vec.push_back(arr[i]);
return vec;
}
}