输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
1.优先队列,队列中先输入前k个元素,然后将剩余元素与队顶元素比较,小于队顶元素则弹出队顶元素并将当前元素进队,否则不进队。
2.快速排序:以下标返回值是否为k-1为判断依据,当返回值等于k-1则下表为k-1的元素及其左边元素全部即为前k个最小的数。如果返回值大于k则对返回值下表及其左边元素继续快速排序,如果返回值小于k则对返回值下标及其右边元素继续排序。
class Solution40 {
public:
//优先队列
vector<int> getLeastNumbers(vector<int>& arr, int k)
{
priority_queue<int>q;
vector<int>res;
int n = arr.size();
if(n<k)
{
int i;
while(res.size() != n)
{
res.push_back(arr[i]);
i++;
}
}
else
{
for(int i = 0;i<k;i++)
{
q.emplace(arr[i]);
}
for(int i = k;i<n;i++)
{
if(arr[i]<q.top())
{
q.pop();
q.emplace(arr[i]);
}
}
while(!q.empty())
{
res.push_back(q.top());
q.pop();
}
}
return res;
}
//快速排序加判断k
vector<int> getLeastNumbers1(vector<int>& arr, int k)
{
vector<int>res;
int n = arr.size();
if(n == 0)
return res;
res = QuickResearch(arr,0,n-1,k-1);
return res;
}
vector<int>QuickResearch(vector<int>& arr,int lo,int hi,int k)
{
int low ;
low = quickSort(arr,lo,hi);
if(low == k)
{
vector<int>res;
for(int i = 0;i<=k;i++)
{
res.push_back(arr[i]);
}
return res;
}
return low >k?QuickResearch(arr,0,low-1,k):QuickResearch(arr,low+1,hi,k);
}
int quickSort(vector<int>& arr,int l ,int h)
{
int i = l;
int j = h;
int x = arr[i];
do
{
while(i<j && arr[j]>= x)
{
j--;
}
if(i<j )
{
arr[i] = arr[j];
i++;
}
while(i<j && arr[i]<=x)
{
i++;
}
if(i<j )
{
arr[j] = arr[i];
j--;
}
}while(i<j);
arr[i] = x;
return i;
}
};