【C++每日一练】13.最小的k个数
描述
给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
数据范围:0<= k,n≤10000,数组中每个数的大小010000≤val≤1000
要求:空间复杂度 O(n)O(n) ,时间复杂度 O(nlogn)O(nlogn)
方法一:排序
直接排序,然后去前k小数据。
class Solution {public:vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {vector<int> ret;if (k==0 || k>input.size()) return ret;sort(input.begin(), input.end());return vector<int>({input.begin(), input.begin()+k}); }
};
时间复杂度:O(n long n)
空间复杂度:O(1)
方法二:堆排序
建立一个容量为k的大根堆的优先队列。遍历一遍元素,如果队列大小<k,就直接入队,否则,让当前元素与队顶元素相比,如果队顶元素大,则出队,将当前元素入队
class Solution {public:vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {vector<int> ret;if (k==0 || k > input.size()) return ret;priority_queue<int, vector<int>> pq;for (const int val : input) {if (pq.size() < k) {pq.push(val);}else {if (val < pq.top()) {pq.pop();pq.push(val);}}}while (!pq.empty()) {ret.push_back(pq.top());pq.pop();}return ret;}
};
时间复杂度:O(nlongk), 插入容量为k的大根堆时间复杂度为O(longk), 一共遍历n个元素
空间复杂度:O(k)
【C++每日一练】13.最小的k个数相关推荐
- Leetcode 剑指 Offer 40. 最小的k个数 (每日一题 20210825)
输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4.示例 1:输入:arr = [3,2,1], k = 2 输出: ...
- 漫画:BAT必考题目 (最小的k个数)
今天分享一道比较简单的题目,希望大家可以5分钟掌握! 01 PART 最小的k个数 很简单有木有~ 最小的k个数:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3 ...
- 剑指offer 40.最小的 K 个数 python代码
题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...
- 九度 1371 最小的K个数
题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行:第一行为2个整数n,k(1<= ...
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...
- 海量数据中,寻找最小的k个数。
维护k个元素的最大堆,即用容量为k的最大堆存储最小的k个数,k1设为大顶堆中最大元素.遍历一次数列,n,每次遍历一个元素x,与堆顶元素比 较,x<kmax,更新堆,否则不更新堆. 1 // 海量 ...
- 剑指Offer——面试题30:最小的K个数
题目:输入N个数字,找出其中最小的K个数. 思路:维护一个数组KMin,长度为K,存放最小的K个数.遍历原始数组的过程中,如果KMin不满,就直接在后边插入新的数字:如果KMin满了,就要找到其中最大 ...
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶 ...
- 面试题30.最小的k个数
题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方 ...
最新文章
- 判断点是否在凸多边形内
- win10电脑黑屏只有鼠标箭头_电脑开机进入系统后显示黑屏,只能看到一个鼠标指针,如何解决?...
- CA证书和TLS介绍
- 《springcloud超级入门》Spring Cloud是什么?Spring Cloud版本介绍《二》
- hls二次加密 m3u8_将视频转换为m3u8,使用AES-128的方式加密HLS真的有效吗?
- diolog js_js组件-js插件-jquery插件-dialog对话框弹层
- 玩转地图投影公式,通过例题对兰伯特投影与墨卡托投影求取正反解
- Python爬虫之青果教务系统
- CMD文件的编写说明,比较详细的 1·什么是CMD文件,它有什么作用。
- java postgresql date_javapostgresql时区总结
- 一些Mac OS X技巧
- UE5 tiles 材质缩放平铺
- 怎么批量把图片转文字?教你几招轻松完成
- 证明残差的平均值等于0,残差以x加权的平均值为0
- GSM/GPRS+GPS模块SIM808
- 【模拟退火】[JSOI2016]炸弹攻击1
- mysql驱动的依赖和spring jdbc依赖是什么关系
- 告诉你重装系统win7方法,怎么一键重装win7系统
- 日语五十音图快速记忆法和搞笑版
- 【LAB2-Cisco】网络数据通信过程——ping不通如何排查