class Solution {
public:
int my_rand(int low,int high)
{
int size = high - low + 1;
return low + rand() % size;
}
int Partition(vector<int>& a, int low, int high)
{
int i = low-1;
if (low < high)
{
i = low;
int j = high;
int tmp = a[low];
while (i < j)
{
while (i<j && a[j]>tmp)
j--;
if (i < j)
{
a[i] = a[j]; ++i;
}
while (i<j && a[i] < tmp)
i++;
if (i<j)
{
a[j] = a[i]; --j;
}
}
a[i] = tmp;
}
return i;
}
void swap1(int& a, int& b)
{
a = a^b;
b = a^b;
a = a^b;
}
void k_leastMin(vector<int>& a, int low, int high,int k)
{
if (low >=high)
return;
int index;
index = my_rand(low, high);
swap1(a[low], a[index]);
int i = Partition(a, low, high);
if (i == k - 1)
return;
else
{
if (i < k - 1)
k_leastMin(a, i + 1, high, k);
else
k_leastMin(a, low, i - 1, k);
}
}
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(k<1 || input.size()==0 || k>input.size())
return res;
k_leastMin(input,0,input.size()-1,k);
for(int i=0;i<k;++i)
res.push_back(input[i]);
return res;
}
};
求一个数组中最小的k个数
最新推荐文章于 2020-10-02 12:23:39 发布