题目链接
思路分析
这是一道大厂常见题目,经常在面试中会遇到,下面介绍两种思路
思路1
可以直接使用sort方法,对数进行排序,然后把前k个数返回就可以
思路2
借助堆排序的思想,由于题目需要最小的K个数,因此我们可以先建立一个大小为K的大顶堆,然后将堆顶元素与未入堆的元素进行比较,如果该元素小于堆顶元素,则与之交换,重复此类过程,最终堆中数据就是最小的K个数
解题代码
class Solution {
public:
void adjustDown(vector<int>& heap, int n, int root)
{
int parent = root;
int child = (2 * parent) + 1;
while(child < n)
{
if(child +1 < n && heap[child] < heap[child+1])
{
++child;
}
if(heap[parent] < heap[child])
{
swap(heap[parent], heap[child]);
parent = child;
child = 2*parent +1;
}
else
{
break;
}
}
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int>heap(k, 0);
if(k == 0)
return heap;
//初始化数组
for(int i = 0; i < k; ++i)
{
heap[i] = arr[i];
}
//初始化建堆
for(int i = (k-1-1)/2; i >= 0; --i)
{
adjustDown(heap, k, i);
}
//删堆顶元素
int size = arr.size();
size -= k;
while(size--)
{
if(arr[k] < heap[0])
{
swap(heap[0],arr[k]);
adjustDown(heap, heap.size(), 0);
}
k++;
}
// for(int num : heap)
// // {
// // cout << num << " ";
// // }
return heap;
}
};