美文网首页
算法进阶——最小的K个数

算法进阶——最小的K个数

作者: 拉普拉斯妖kk | 来源:发表于2023-10-12 15:08 被阅读0次

题目


给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。

数据范围:0≤k,n≤10000,数组中每个数的大小0≤val≤1000

要求:空间复杂度 O(n) ,时间复杂度 O(nlogk)

示例1

输入:
[4,5,1,6,2,7,3,8],4 
返回值:
[1,2,3,4]
说明:
返回最小的4个数即可,返回[1,3,2,4]也可以

示例2

输入:
[1],0
返回值:
[]

示例3

输入:
[0,1,2,1,2],3
返回值:
[0,1,1]

思路


利用一个容量为k的multiset来记录临时的最小k个数,循环遍历数组,如果multiset的大小小于k,就直接将元素存入multiset中。存够k个数后,每次将当前元素与multiset的最后一个元素比较,如果当前元素较小,则删除multiset的最后一个元素,将当前元素插入multiset中。最后multiset中就是想要的结果。

解答代码


class Solution {
public:
    /**
     * @param input int整型vector 
     * @param k int整型 
     * @return int整型vector
     */
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {
        // write code here
        vector<int> ret{};
        if (k > input.size() || k == 0) {
            return ret;
        }

        multiset<int> tmp;// 用multiset临时记录最小的k个数
        for (auto num : input) {
            if (tmp.size() < k) {
                tmp.insert(num);
                continue;
            }
            
            auto cur_max_it = --tmp.end();// multiset本身是排序的,取最后一个值就是目前的临时记录中的最大值
            if (num < *cur_max_it) {
                // 找到更小值,则删除最大值的元素,将新的值加到multiset中
                tmp.erase(cur_max_it);
                tmp.insert(num);
            }
        }

        for (auto n : tmp) {
            ret.push_back(n);
        }

        return ret;
    }
};

相关文章

  • Tensorflow基本模型之K-means

    K-Means算法简介 K-MEANS算法是输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准k...

  • LeetCode 面试题 17.14. 最小K个数

    题目 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 0 <= len(arr) <=...

  • k-means算法原理及实战

    1 K-means原理 K-means算法是输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准k...

  • 排序算法

    一、排序算法总结 排序算法题目 排序算法快速排序堆排序归并排序 应用最小K个数(TopK问题)215.数组中的第K...

  • 最小的k个数

    题目 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 输入: arr = [1,3,5...

  • 面试题 17.14. 最小K个数

    设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 输入: arr = [1,3,5,7,...

  • 【冲冲冲】Leetcode每日打卡之最小k个数(快排or大顶堆)

    设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,...

  • 算法-数组(三)

    最小的k个数 求子数组的最大和 把数组排成最小的数字 1.最小的k个数 问题描述:输入n个数字,找到数组中最小的k...

  • 06-20:刷题综合三:快排

    快排: 1、快速排序 2、快速排序寻找第K个大 3、最小的K个数 1、手写快排算法 class Solution:...

  • 利用K-均值聚类算法对未标注数据分组(二)

    二分K-均值算法 为了解决K-均值算法收敛于局部最小值的问题,有人提出了二分K-均值的算法。首先,将整个数据集作为...

网友评论

      本文标题:算法进阶——最小的K个数

      本文链接:https://www.haomeiwen.com/subject/kicobdtx.html