https://www.2cto.com/database/201807/761742.html
解法一:
类似快排序的变形,确保前k个都是比k小的:
int partSort(int a[],int start,int end ) {
int temp = a[start];
while (start < end) {
while (start < end && a[end] >= temp) {
end--;
}
a[start] = a[end];
while (start < end && a[start] <= temp) {
start++;
}
a[end] = a[start];
}
a[start] = temp;
return start;
}
bool mink(int a[],int aLen,int b[], int bLen, int k) {
if (a == NULL || aLen <k || NULL==b || bLen<k) {
return false;
}
int start = 0;
int end = aLen - 1;
int index = partSort(a,start,end);
while (index != k-1) {
if (index > k-1) {
index = partSort(a,start,index-1);
}
if (index < k-1) {
index = partSort(a,index+1,end);
}
}
for (int j=0; j<k; j++) {
b[j] = a[j];
}
return true;
}
int minkdata1[4] = {0, 0, 0, 0};
mink(minkdata, 8, minkdata1, 4, 4);
解法二:
额外需要语言的大顶推容器【根结点是最大的,比左右子树最大的还大】,不停的干掉root,不停的重塑大顶推,最后剩下的四个就是最小的。
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int> res;
if(k<=0 || k>input.size()) return res;
priority_queue<int> q; // STL中的优先队列默认是大顶堆
unsigned int i=0;
while(i<input.size())
{
q.push(input[i]);
if(q.size()>k) q.pop();
i++;
}
while(!q.empty())
{
res.push_back(q.top()); // C语言中的top()可返回顶部元素的值,也可返回顶部元素的指针,程序员自行设计; C++的STL中top()返回的是顶部的值
q.pop();
}
return res;
}
};