//输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 
//
// 
//
// 示例 1: 
//
// 输入:arr = [3,2,1], k = 2
//输出:[1,2] 或者 [2,1]
// 
//
// 示例 2: 
//
// 输入:arr = [0,1,2,1], k = 1
//输出:[0] 
//
// 
//
// 限制: 
//
// 
// 0 <= k <= arr.length <= 10000 
// 0 <= arr[i] <= 10000 
// 
// Related Topics 堆 分治算法 
// 👍 191 👎 0

/*
* 剑指 Offer 40 最小的k个数
* 2021-02-18 11:40:47
* @author oxygenbytes
*/ 
#include "leetcode.h" 
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        int n = arr.size();
        priority_queue<int, vector<int>, less<int>> pq;

        for(int i = 0;i < n;i++){
            if(pq.size() < k){
                pq.push(arr[i]);
            }else{
                if(pq.size() && pq.top() > arr[i]) pq.pop(), pq.push(arr[i]);
            }
        }
        vector<int> ans;
        while(pq.size()) ans.push_back(pq.top()), pq.pop();

        return ans;
    }
};
//leetcode submit region end(Prohibit modification and deletion)