#include <vector>
#include <queue>
using namespace std;

class Solution {
  public:
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {
        // 处理特殊情况:如果k为0,直接返回空向量
        if (k == 0) return vector<int>();

        int n = input.size();
        // 如果k大于等于数组长度,直接返回整个数组的副本
        if (k >= n) return input;

        // 使用最大堆(priority_queue默认是最大堆)来维护当前最小的k个数
        // 堆顶元素是当前k个数中的最大值
        priority_queue<int> heap;

        // 遍历输入数组
        for (int num : input) {
            // 如果堆的大小还小于k,直接加入当前元素
            if (heap.size() < k) {
                heap.push(num);
            } else {
                // 如果堆已满(大小为k),且当前元素比堆顶元素小
                // 说明当前元素应该被包含在最小的k个数中
                if (num < heap.top()) {
                    // 移除堆顶元素(当前k个数中的最大值)
                    heap.pop();
                    // 加入当前更小的元素
                    heap.push(num);
                }
                // 如果当前元素大于等于堆顶元素,则忽略它
            }
        }

        // 将堆中的元素提取到结果向量中
        vector<int> res;
        while (!heap.empty()) {
            // 从堆顶开始取出元素(最大堆,所以先取出的是较大的元素)
            res.push_back(heap.top());
            heap.pop();
        }

        // 返回结果向量
        // 注意:结果向量中的元素顺序是从大到小的,因为是从最大堆中依次弹出的
        // 但题目要求任意顺序皆可,所以这个顺序是可以接受的
        return res;
    }
};

最小的k个数 可以使用最大堆或快排
第k小的数 一般情况:使用快速选择算法,实现简单且平均性能好;数据流场景:使用堆方法;数值范围小:使用计数排序;对最坏情况有严格要求:使用BFPRT算法