题目链接:
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
思路:快速排序的变形
方法一:
class Solution {
public:
vector<int>result;
int findNum(vector<int>& arr,int k,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 QSort(vector<int>&arr,int k,int l,int r)
{
if(l<=r)
{
int low=findNum(arr,k,l,r);
if(low+1-l<k)
{
for(int i=l;i<=low;i++)
result.push_back(arr[i]);
QSort(arr,k-low-1+l,low+1,r);
}
else if(low+1-l==k)
{
for(int i=l;i<=low;i++)
result.push_back(arr[i]);
return;
}
else QSort(arr,k,l,low-1);
}
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
int len=arr.size();
QSort(arr,k,0,len-1);
return result;
}
};
方法二:
class Solution {
public:
int findNum(vector<int>& arr,int k,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;
}
vector<int> QSort(vector<int>&arr,int k,int l,int r)
{
int low=findNum(arr,k,l,r);
while(low!=k-1)
{
if(low+1<k)l=low+1;
else r=low-1;
low=findNum(arr,k,l,r);
}
return vector<int>(arr.begin(),arr.begin()+k);
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
int len=arr.size();
if(k==0)return vector<int>();
return QSort(arr,k,0,len-1);
}
};