剑指 Offer 40. 最小的k个数
Posted dtwd886
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 40. 最小的k个数相关的知识,希望对你有一定的参考价值。
题目链接:
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);
;
以上是关于剑指 Offer 40. 最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章