最小的k个数

153 阅读1分钟

输入整数数组 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;

}

}