题目

题链:剑指 Offer 40. 最小的k个数

题解

1. 快速排序

这题通常都会想到先将数组排序然后取前k个数即可,用Arrays.sort方法可以进行排序、但很明显面试这样写肯定叫你回家的等消息的,所以我们要自己写排序。

大佬题解讲解:
剑指 Offer 40. 最小的 k 个数(基于快速排序的数组划分,清晰图解)

 public int[] getLeastNumbers01(int[] arr, int k) {quickSort(arr,0,arr.length-1);return Arrays.copyOf(arr,k);}private void quickSort(int[] arr,int l,int r){if (l >= r){return;}int i = l,j = r;while (i<j){// 找到右边比基准值小的数的下标while (i<j && arr[j]>=arr[l]){j--;}// 找到左边比基准值大的数下标while (i<j && arr[i]<=arr[l]){i++;}// 找到之后交换位置swap(arr,i,j);}// 哨兵划分swap(arr,i,l);// 递归小于当前基准值的数组quickSort(arr,l,i-1);// 递归大于当前基准值的数组quickSort(arr,i+1,r);}private void swap(int[] arr,int i,int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

2.堆

使用堆思想、用一个大根堆、先放入前k个数组值、然后再遍历剩余的数组值、有小于堆顶值的数就删掉堆顶值、再将数放入。依次下去最后剩下的都是数组中值小的前k个数。

public int[] getLeastNumbers02(int[] arr, int k) {int[] res = new int[k];if (k == 0){return res;}// 大根堆PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {@Overridepublic int compare(Integer num1, Integer num2) {return num2 - num1;}});// 放入前k个数for (int i = 0; i < k; i++) {queue.offer(arr[i]);}// 判断剩余的数for (int i=k;i<arr.length;i++){if (queue.peek()>arr[i]){queue.poll();queue.offer(arr[i]);}}// 将堆中的值给存放结果的数组for (int i = 0; i < k; i++) {res[i] = queue.poll();}return res;}

(day 17 - 快排)剑指 Offer 40. 最小的k个数相关推荐

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

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

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

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

  3. 【力扣刷题】剑指 Offer 40. 最小的k个数(大顶堆)

    题目: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例: 输入:arr = [3,2,1], k = 2 ...

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

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...

  5. 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...

  6. 剑指offer 40.最小的 K 个数 python代码

    题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...

  7. 剑指 Offer 40. 最小的k个数

    题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 输入:arr = [3,2,1], k = 2 输 ...

  8. LeetCode_Heap_剑指 Offer 40. 最小的k个数 【堆,泛型实现,自定义比较器】【C++/java】【简单】

    目录 一,题目描述 英文描述 中文描述 示例与说明 二,解题思路 1,手动实现堆--C++泛型实现 2,手动实现堆--java泛型实现 3,快速使用堆--C++ 优先队列 pop_heap().pus ...

  9. 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 输出: ...

  10. 【算法】剑指 Offer 40. 最小的k个数 【重刷】

    1.概述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k ...

最新文章

  1. (十四)json、pickle与shelve模块
  2. 第三周项目4(2)-顺序表应用 将所有奇数移到所有偶数前面
  3. 数据结构与算法JavaScript (一) 栈
  4. mq多个消费者消费一个消息_一个普通消费者的米家产品使用感受
  5. Vue项目中Table设置 render 函数
  6. Analysis of Cloud Computing Architectures阅读笔记--提出了Screen虚拟化方法
  7. 基于Tezos的算法稳定币Kolibri启动测试版
  8. SAP License:ERP项目经理需求调研的惨痛经历
  9. MATLAB信号处理之离散时间系统的时域分析
  10. 【数据分析学习】016-numpy数据结构
  11. 自动化运维工具 ansible的安装 及远程操作命令
  12. 什么是Proxy Server
  13. 使用XTU降低CPU功耗,自动执行不失效
  14. Oracle11g 体系结构
  15. 红米note10和红米note8pro哪个好
  16. DSP TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制时的噪声抑制
  17. stm32f407zgt6的pdr_on引脚怎么接
  18. C语言用函数指针实现数组排序
  19. 网络安全有哪些岗位,如何成为一位优秀的网络安全工程师?
  20. LeetCode 力扣C++题解 575. 分糖果

热门文章

  1. Oracle Database 11g 下载
  2. 转帖——精妙SQL语句
  3. 28.程序管理(ps,top)
  4. 7.Magento系统配置(System.xml)
  5. 洛谷 P4568 [JLOI2011]飞行路线
  6. WebAssembly 介绍
  7. 20155313 2016-2017-2 《Java程序设计》第十周学习总结
  8. 基于Docker布署伪分布式hadoop环境(一)
  9. TatukGIS - GisDefs - CanonicalSQLName 函数
  10. 实现手机访问网站时点击手机号码直接拨打电话的功能