zoukankan      html  css  js  c++  java
  • 面试题40:最小的k个数(C++)

    题目地址https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/

    题目描述

    输入整数数组 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]

    解题思路

    传统法:题目很简单,我们先对原数组从小到大排序,然后取出k个数即可。

    大根堆:使用一个大根堆(优先队列)实时维护数组的前 k小值。首先将前 k个数插入大根堆中,随后从第 k+1个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,则将堆顶的数弹出,然后插入当前遍历到的数。最后将大根堆里的数存入数组返回即可。

    程序源码

    传统法

    class Solution {
    public:
        vector<int> getLeastNumbers(vector<int>& arr, int k) {
            vector<int> arr1(k, 0);
            sort(arr.begin(), arr.end());
            for(int i = 0; i < k; i++) arr1[i] = arr[i];
            return arr1;
        }
    };

    大根堆

    class Solution {
    public:
        vector<int> getLeastNumbers(vector<int>& arr, int k) {
                if(arr.empty() || k == 0) return {};
                vector<int> res;
                priority_queue<int> que;
                for(int i = 0; i < k; i++)
                {
                    que.push(arr[i]);
                }
                for(int j = k; j < arr.size(); j++)
                {
                    if(que.top() > arr[j])
                    {
                        que.pop();
                        que.push(arr[j]);
                    }
                }
                for(int i = 0; i < k; i++)
                {
                    res.push_back(que.top());
                    que.pop();
                }
                return res;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    “王者对战”之 MySQL 8 vs PostgreSQL 10
    PostgreSQL 进程结构
    Linux core dump 诊断进程奔溃退出
    linux下core dump--转载
    2.4 等比数列
    2.3 等差数列的前n项和
    2.2 等差数列
    1.1.1 三角形正弦定理
    调整颜色
    去括号法则
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12530211.html
Copyright © 2011-2022 走看看