1、直接法 排序选k个
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k)
{
vector<int> res;
sort(arr.begin(), arr.right());
res.assign(arr.begin(), arr.begin() + k);
return res;
}
};
2、借助快排+递归
class Solution
{
public:
int partition(vector<int>& arr,int left, int right);
void randomized_selected(vector<int>& arr, int left, int right, int k);
public:
vector<int> getLeastNumbers(vector<int>& arr, int k);
};
int Solution::partition(vector<int>& arr, int left, int right)
{
int temp = arr[left];
while (left < right)
{
while (left < right && arr[right] >= temp)
{
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] <= temp)
{
left++;
}
arr[right] = arr[left];
}
arr[left] = temp;
return left;
}
void Solution::randomized_selected(vector<int>& arr, int left, int right, int k)
{
if (left >= right)
{
return;
}
int pos = partition(arr, left, right);
int num = pos - left + 1;
if (k == num)
{
return;
}
else if (k < num)
{
randomized_selected(arr, left, pos - 1, k);
}
else
{
randomized_selected(arr, pos + 1, right, k - num);
}
}
vector<int> Solution::getLeastNumbers(vector<int>& arr, int k)
{
vector<int> res;
randomized_selected(arr, 0, arr.size() - 1, k);
res.assign(arr.begin(), arr.begin() + k);
return res;
}
3、优先队列,选择大顶堆,优先队列还是个队列只能弹出队头元素
class Solution
{
public:
vector<int> getLeastNumbers(vector<int>& arr, int k)
{
vector<int> res;
if (k == 0)//注意边界条件 当然也可以加上 if (k > arr.size())的判断
return res;
priority_queue<int, vector<int>> priq;
for (int i = 0; i < k; ++i)
{
priq.push(arr[i]);
}
int i = k;//注意这个i = k 不要写成i = 0;
while (i < arr.size())
{
if (arr[i] < priq.top())
{
priq.pop();
priq.push(arr[i]);
}
i++;
}
while (!priq.empty())
{
res.push_back(priq.top());
priq.pop();
}
return res;
}
};
优先队列的补充:关于优先队列的格式