题意
题解
快排解决
因为没有要求要有序的返回TopK,那么该题可以利用快排进行划分排序的性质。即每次快排完成一次划分,判断当前划分位置和所需K的大小,来决定是终止划分还是继续划分。
大根堆
取数组中的前K个树,建一个大小为K的大根堆。然后将剩余的数和大根堆堆顶的数进行比较,若大于堆顶数则跳过。否则,先将堆顶元素弹出,再将该数插入堆中。
代码
快排题解
class Solution {public:vector<int> getLeastNumbers(vector<int>& arr, int k) {quickSort(arr, 0, arr.size()-1, k);vector<int> res;for (int i = 0; i < k; i++) {res.push_back(arr[i]);}return res;}private:void quickSort(vector<int>& arr, int l , int r, int k) {if (l > r) return;int st = l, ter = r;while (st < ter) {while (arr[ter] >= arr[l] && st < ter) ter--;while (arr[st] <= arr[l] && st < ter) st++;swap(arr[ter], arr[st]);}swap(arr[l], arr[st]);if (st+1 == k) return;else if (st+1 < k)quickSort(arr, st + 1, r, k);else quickSort(arr, l, st-1, k);}};
