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

示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]

限制:

  • 0 <= k <= arr.length <= 10000
  • 0 <= arr[i] <= 10000

分析:

方法:快速排序优化

这道题寻找最小的 k 个数,只要对原数组进行排序,然后返回前 k 个数即可。但是既然是找最小的k 个数,那么只要知道这 k 个数是那些就可以了,这 k 个数 和其他数就不需要排序,因为快速排序有个二分的特点,即分开的两个部分,左边的数一定小于右边的数,因此我们可以对快排做个优化,如果 k 大于分开点,那么左边的就不用排序,如果 k 小于分开点,那么右边的就不用排序。

时间复杂度:O(n)
空间复杂度:O(log n)

class Solution {public int[] getLeastNumbers(int[] arr, int k) {quickSort(0, arr.length-1, arr, k);return Arrays.copyOf(arr, k);}public void quickSort(int start, int end, int[] arr, int k){//start 大于等于 end 或者 该范围刚好全在或全不在 (0,k) 中 直接返回if(end < k || start >= k){return;}//定义双指针和辅助变量int i = start, j = end, t = arr[start];while(i < j){while(i < j && arr[j] >= t){j--;}while(i < j && arr[i] <= t){i++;}//交换int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}arr[start] = arr[i];arr[i] = t;quickSort(start, j-1, arr, k);quickSort(i+1, end, arr, k);}
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof

JAVA练习55-最小的k个数相关推荐

  1. Java实现寻找最小的k个数

    1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ...

  2. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

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

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

  4. [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]

    [问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...

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

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

  6. java笔试题:海量数据找最大或最小的k个数(堆排序)

    题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...

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

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

  8. 【剑指offer】面试题40:最小的k个数(java)

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

  9. 【剑指Offer】最小的k个数---大顶堆 Java

    题目:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 求数组中最小(最大)的n个数通常可以使用大顶堆(小顶堆) ...

  10. 最小的k个数(Java)

    题目: 输入n个整数,找出其中最小的k个数.例如输入4. 5. 1. 6. 2. 7. 3. 8这8个数字,则最小的4个数字是1. 2. 3. 4. 思路:O(n)的算法,只有当我们可以修改输入的数组 ...

最新文章

  1. 【254天】跃迁之路——程序员高效学习方法论探索系列(实验阶段12-2017.10.17)...
  2. vector机器人 HOW TO CHARGE VECTOR 如何给矢量充电
  3. 围城之势已起,拼多多骑虎难下
  4. VTK:PolyData之PolyDataCellNormals
  5. python是谁维护的_Python是维护拆分的更可靠的方法
  6. commit分拆多个 git_Git操作:在多个分支之间,使用git am打patch和同步分支
  7. java 与sas交互_SAS与MACRO的交互使用
  8. Kibana安装-源码
  9. 爬取豆瓣评论连接mysql_Scrapy爬取豆瓣图书数据并写入MySQL
  10. IT程序猿应该投资些什么
  11. java8新特性及汪文君Google Guava项目实战
  12. html 360登录自动填写,汇总:如何在360浏览器中删除自动填写的表单?
  13. 多媒体计算机的组成元素,什么是多媒体计算机的组成
  14. 跟着团子学SAP PS:项目计划成本与项目预算设计思路
  15. Jenkins部署到远程服务器
  16. 文件锁(一)——文件锁的概述
  17. 蓝桥杯CT107D:关于矩阵键盘工作原理及其应用
  18. 计算机专业助我成长作文600,科技伴随我成长作文
  19. 【硬件】如何使用MOS管作为开关控制?如何看懂参数?如何MOS管选型?(从原理上分析)
  20. uniapp 实现聊天页面 textarea固定在底部且高度自增

热门文章

  1. GB28181协议实现系列之----SDK Demo发布(7)
  2. GPS 射频调试总结
  3. 上海城建坐标与WGS84坐标转换工具
  4. 计算机dll修复工具,DLL修复工具有哪些?DLL修复工具盘点
  5. 华为模拟器路由器交换机远程控制
  6. Java之 OOP编程思想理解1
  7. gif android 点击 加载,Android两种简单的加载GIF图片的方法
  8. 2021-07-13
  9. 【富文本】解决会声会影、PR、AE处理视频后过大的问题(三款工具)专业视频压制软件|专业视频压制神器下载
  10. zte机顶盒怎么投屏_中兴iptv机顶盒可以投屏吗?