题解 | #最小的K个数#

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

方法一:排序

将输入的数组进行排序,取前 K个值即可

时间复杂度:O(nlongk)

空间复杂度:O(1)

class Solution {
  public:
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {
        vector<int> res;
        //特殊情况处理
        if (k == 0 || k > input.size())
            return res;
	  	//排序
        sort(input.begin(), input.end());

       for(int i = 0; i < k; i++) {
            res.push_back(input[i]);
       }

        return res;
    }
};

方法二:堆排序

设置一个大小为K的优先队列,将输入数组插入到优先队列中,最终就得到前K个大小的数组

时间复杂度:O(nlongk)

空间复杂度:O(k)

class Solution {
  public:
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {
        vector<int> res;
        //特殊情况处理
        if (k == 0 || k > input.size())
            return res;
        //大顶堆
        priority_queue<int, vector<int>> temp;

        for (int i = 0; i < input.size(); i++) {
            if (i < k)
                temp.push(input[i]);
            else {
                if (input[i] < temp.top()) {
                    temp.pop();
                    temp.push(input[i]);
                }
            }
        }

        while (!temp.empty()) {
            res.push_back(temp.top());
            temp.pop();
        }

        return res;
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论

相关推荐

_mos_:我以为手抄报简历就已经很顶了,没想到还有表格简历
点赞 评论 收藏
分享
zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务