程序员面试金典 - 面试题 17.14. 最小K个数(快排划分O(n))
1. 题目
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]提示:
0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/smallest-k-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 排序
class Solution {public:vector<int> smallestK(vector<int>& arr, int k) {sort(arr.begin(),arr.end());return vector<int>(arr.begin(),arr.begin()+k);}
};
2.2 优先队列(堆)
class Solution {public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int,vector<int>,greater<int>> q;//小顶堆for(auto& a : arr)q.push(a);arr.clear();while(k--){arr.push_back(q.top());q.pop();}return arr;}
};
2.3 快排划分
参考此篇文章:LeetCode 215. 数组中的第K个最大元素(快速排序)
class Solution {public:vector<int> smallestK(vector<int>& arr, int k) {if(arr.empty()||(k==0))return {};findkth(arr,k,0,arr.size()-1);return vector<int> (arr.begin(), arr.begin()+k);}int findkth(vector<int>& arr, int& k, int l, int r){selectMid(arr,l,r);int p = arr[l];int i = l, j = r;while(i < j){while(i < j && arr[j] > p)j--;swap(arr[i],arr[j]);while(i < j && arr[i] <= p)i++;swap(arr[i],arr[j]);}if(i == k)return i;else if(i < k)return findkth(arr,k,i+1,r);return findkth(arr,k,l,i-1);}void selectMid(vector<int>& arr, int& l, int& r){int mid = l+((r-l)>>1);if(arr[mid] > arr[r])swap(arr[mid],arr[r]);if(arr[l] > arr[r])swap(arr[mid],arr[r]);if(arr[mid] > arr[l])swap(arr[mid],arr[l]);}
};
程序员面试金典 - 面试题 17.14. 最小K个数(快排划分O(n))相关推荐
- 程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)
1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数. 注意,不是必须有这些素因子,而是必须不包含其他的素因子. 例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示 ...
- 【每日一题】 面试题 17.14. 最小K个数
面试题 17.14. 最小K个数
- 面试题 17.14. 最小K个数
面试题 17.14. 最小K个数 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3 ...
- leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...
- 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...
- 程序员面试金典 - 面试题 17.07. 婴儿名字
题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...
- 程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map)
1. 题目 两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度. 例如,{1, 5, 3} 和 {1, 7, 2, 3} ...
- 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)
1. 题目 编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数. 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 ...
- 程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)
文章目录 1. 题目 2. 解题 2.1 前缀和(超时) 2.2 动态规划 1. 题目 给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵. 返回一个数组 [r1, c1 ...
最新文章
- Redis---持久化
- 构建高并发高可用安全的IT系统-高并发部分
- 进度条(页面刷新)【原创】
- matlab主要数据预处理函数,Matlab 神经网数据预处理的函数
- 以太坊技术架构/技术栈
- Android 版权介绍
- 网络安装ubuntu操作系统
- 医疗健康领域的短文本解析探索 ----文本纠错
- shell 死循环if判断_一个简单的shell脚本问题!怎么出现了死循环呢?谢谢
- mysql在线修复主从同步
- 微型计算机系统王其藩,王其藩 系统动力学 附录Vensim模型集
- Mac M1 安装JDK8
- 如何识别图片中的文字?三种方法轻松搞定
- 计算机关机时间设置方法,win7 设置定时关机方法_win7 如何设置关机时间-win7之家...
- python使用moviepy包下的VideoFileClip时报错:OSError: [WinError 6] 句柄无效解决方法
- U盘被写保护?我来教你高级格式化
- 计算机菜单命令后省略号,windows菜单命令项的右边有省略号…表 – 手机爱问
- 自动化爬虫selenium基础教程
- 基于FPGA的数字交通红绿灯Verilog开发Modelsim仿真
- 评测TFN F4 高性能OTDR光时域反射仪性能