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))相关推荐

  1. 程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

    1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数. 注意,不是必须有这些素因子,而是必须不包含其他的素因子. 例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示 ...

  2. 【每日一题】 面试题 17.14. 最小K个数

    面试题 17.14. 最小K个数

  3. 面试题 17.14. 最小K个数

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

  4. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

  5. 程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 二分查找 1. 题目 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上.出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一 ...

  6. 程序员面试金典 - 面试题 17.07. 婴儿名字

    题目难度: 中等 原题链接 今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 每年,政府都会公布一万个最常见的婴 ...

  7. 程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map)

    1. 题目 两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度. 例如,{1, 5, 3} 和 {1, 7, 2, 3} ...

  8. 程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)

    1. 题目 编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数. 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 ...

  9. 程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)

    文章目录 1. 题目 2. 解题 2.1 前缀和(超时) 2.2 动态规划 1. 题目 给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵. 返回一个数组 [r1, c1 ...

最新文章

  1. Redis---持久化
  2. 构建高并发高可用安全的IT系统-高并发部分
  3. 进度条(页面刷新)【原创】
  4. matlab主要数据预处理函数,Matlab 神经网数据预处理的函数
  5. 以太坊技术架构/技术栈
  6. Android 版权介绍
  7. 网络安装ubuntu操作系统
  8. 医疗健康领域的短文本解析探索 ----文本纠错
  9. shell 死循环if判断_一个简单的shell脚本问题!怎么出现了死循环呢?谢谢
  10. mysql在线修复主从同步
  11. 微型计算机系统王其藩,王其藩 系统动力学 附录Vensim模型集
  12. Mac M1 安装JDK8
  13. 如何识别图片中的文字?三种方法轻松搞定
  14. 计算机关机时间设置方法,win7 设置定时关机方法_win7 如何设置关机时间-win7之家...
  15. python使用moviepy包下的VideoFileClip时报错:OSError: [WinError 6] 句柄无效解决方法
  16. U盘被写保护?我来教你高级格式化
  17. 计算机菜单命令后省略号,windows菜单命令项的右边有省略号…表 – 手机爱问
  18. 自动化爬虫selenium基础教程
  19. 基于FPGA的数字交通红绿灯Verilog开发Modelsim仿真
  20. 评测TFN F4 高性能OTDR光时域反射仪性能

热门文章

  1. Caffe源码解析2:SycedMem
  2. Linux进程全解12——lIPC机制之管道,SystemV IPC介绍
  3. cmdline常用参数
  4. postgresql 数据表【转】
  5. 生成 excel 直接用 httpServletResponse 输出
  6. 第九章 图形用户界面的并行化(待续)
  7. c/c++ 友元基本概念
  8. centos关闭防火墙
  9. angularjs控制器之间的数据共享与通信
  10. Windows注册表操作基础代码