题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

解题思路

  1. 解法1
    大顶堆,存放k个数字,遍历数组,当堆的数量小于k,则直接加入堆,否则与堆顶元素比较,如果比堆顶元素小,则将堆顶元素移除,并添加当前元素。

  2. 解法2
    我们可以根据快速排序的思想,找到数组中第k个元素,排在其前面的都是比他小的。

实现

  • 解法1
import java.util.ArrayList;
import java.util.TreeSet;public class Solution {public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {ArrayList<Integer> list = new ArrayList<>();if (input == null || input.length < k || k <= 0) return list;TreeSet<Integer> set = new TreeSet<>();for (int i : input) {if (set.size() < k) set.add(i);else {if (set.last() > i) {set.pollLast();set.add(i);}}}list.addAll(set);return list;}
}
  • 解法2
import java.util.ArrayList;
import java.util.Random;
public class Solution {public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {ArrayList<Integer> list = new ArrayList<>();if (input == null || input.length < k || k <= 0) return list;//TreeSet<Integer> set = new TreeSet<>();int par = partion(input, 0, input.length-1);int start = 0, end = input.length - 1;while (par != k-1){if (par < k - 1){start = par + 1;par = partion(input,par + 1, end);}else {end = par - 1;par = partion(input,start,end-1);}}for (int i = 0; i < k; i++){list.add(input[i]);}return list;}private int partion(int[] input, int start, int end) {if (start > end) return 0;Random r = new Random();int rd = r.nextInt(end- start + 1) + start;int tmp = input[rd];input[rd] = input[end];input[end] = tmp;int index =start -1;for (int i = start; i < end; i++){if (input[i] <= input[end]){index++;if (index != i){tmp = input[index];input[index] = input[i];input[i] = tmp;}}}tmp = input[++index];input[index] = input[end];input[end] = tmp;return index;}
}

转载于:https://www.cnblogs.com/ggmfengyangdi/p/5782646.html

剑指Offer_29_最小的K个数相关推荐

  1. 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  2. 剑指offer 最小的k个数

    输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 排序解决的. import java.util.*; public clas ...

  3. 剑指offer40 最小的k个数

    这个题目最坑的是 这个输入的k是几 那么输出的个数就是几 如果全是重复的 比如[1,1,1,1,1,1,1] 如果k=2 那么只能输出[1,1] 题目给的这两个样例完全不能体现这一点啊! 而且第一个样 ...

  4. 剑指offer——最小的K个数和数组中第K大的元素

    解题思路: 乘着做这个题,顺便复习下堆排序. 先说堆排序是一个什么东西:https://blog.csdn.net/u013384984/article/details/79496052 大顶堆升序, ...

  5. 29、剑指offer--最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路:使用multiset存储k个最小值 1)先存入k个值 2 ...

  6. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  7. 《剑指offer》最小的k个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析:剑指offer刷到现在,大家可能都有个很大的感触,那就是要非常熟 ...

  8. C#刷剑指Offer | 【常考题】最小的k个数

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第299篇学习分享 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

  9. 【LeetCode】剑指 Offer 40. 最小的k个数

    [LeetCode]剑指 Offer 40. 最小的k个数 文章目录 [LeetCode]剑指 Offer 40. 最小的k个数 一.笨比解法 二.堆排序 三.快速选择 总结 一.笨比解法 选择排序变 ...

最新文章

  1. ASP.NET设置ie打印两法 (精)(转)
  2. c++ 函数过长 拆分_实用EXECL办公函数 【多条件排名】
  3. 谈谈 SAP 产品 UI 开发中的组件概念
  4. CF535C Tavas and Karafs 二分 + 结论
  5. python下载显示文件丢失_Microsoft.PythonTools.resources.dll
  6. 求职攻略 | Datawhale助力秋招最强战甲
  7. 2017 前端大事件和趋势回顾,2018 何去何从?
  8. oracle wm_concat listagg,oracle分析函数:四、listagg和wmsys.wm_concat
  9. 基于产生式系统的野人渡河问题求解
  10. 计算机小喇叭找不到,如何解决电脑右下角的小喇叭不见了的问题
  11. [硬件选型] 工业相机之相机分类
  12. springtboot 操作es
  13. 计算机毕业优秀作品展观后感,毕业设计作品展观后感
  14. 翻转单词顺序(python)
  15. 华硕美版路由器RT-AC1200G+解决无线信号弱问题
  16. 疑问点sqlilibs 第一关
  17. java调adobe打印_Java报表工具打印方案集锦 | 改变自己
  18. android手机屏幕总是闪烁,手机屏幕闪烁是什么原因
  19. 打造Android万能下拉刷新上拉加载控件
  20. 浏览器-网页标题的图标

热门文章

  1. 广播系统android安全:flag FLAG_RECEIVER_REGISTERED_ONLY的意义
  2. 配置 Cisco ASA Static IP Addressing or DHCP for IPSec ××× Client
  3. linux内存释放和使用限制
  4. mysql 系统参数优化方法_Mysql 性能优化2 系统参数配置方法 和 文件系统
  5. python字符串合并去重_Python合并同类项的字符串,一对多
  6. Apex Integration Overview
  7. Windows系统软件推荐
  8. PyQt5 技巧篇-便于文字排版的等宽字体推荐:Source Code Pro的中文为英文两倍宽字体
  9. 学习记录(电子信息专业)
  10. 使用Matlab画心形线