题解 | #最小的K个数#
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
手写小根堆,注意数组下标从1开始,因此将数组第一个元素push back到最后。
#include <climits> #include <vector> class Solution { public: void down(vector<int> &input, int k, int sz) { int t = k; if (2 * k < sz && input[2 * k] < input[t]) t = 2 * k; if (2 * k + 1 < sz && input[2 * k + 1] < input[t]) t = 2 * k + 1; if (t != k) { swap(input[t], input[k]); down(input, t, sz); } } vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> res; if (!input.size() || !k || input.size() < k) return res; input.emplace_back(input[0]); // 使数组下标从1开始 int sz = input.size() - 1; for (int i = sz / 2; i; --i) down(input, i, sz); for (int i = 1; i <= k; ++i) { res.push_back(input[1]); input[1] = input[sz]; down(input, 1, sz); --sz; } return res; } };