JAVA练习55-最小的k个数
输入整数数组 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个数相关推荐
- Java实现寻找最小的k个数
1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen. ...
- 伍六七带你学算法 入门篇-最小的k个数
java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]
[问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...
- 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...
- java笔试题:海量数据找最大或最小的k个数(堆排序)
题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...
- LeetCode_Heap_剑指 Offer 40. 最小的k个数 【堆,泛型实现,自定义比较器】【C++/java】【简单】
目录 一,题目描述 英文描述 中文描述 示例与说明 二,解题思路 1,手动实现堆--C++泛型实现 2,手动实现堆--java泛型实现 3,快速使用堆--C++ 优先队列 pop_heap().pus ...
- 【剑指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 输 ...
- 【剑指Offer】最小的k个数---大顶堆 Java
题目:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 求数组中最小(最大)的n个数通常可以使用大顶堆(小顶堆) ...
- 最小的k个数(Java)
题目: 输入n个整数,找出其中最小的k个数.例如输入4. 5. 1. 6. 2. 7. 3. 8这8个数字,则最小的4个数字是1. 2. 3. 4. 思路:O(n)的算法,只有当我们可以修改输入的数组 ...
最新文章
- 【254天】跃迁之路——程序员高效学习方法论探索系列(实验阶段12-2017.10.17)...
- vector机器人 HOW TO CHARGE VECTOR 如何给矢量充电
- 围城之势已起,拼多多骑虎难下
- VTK:PolyData之PolyDataCellNormals
- python是谁维护的_Python是维护拆分的更可靠的方法
- commit分拆多个 git_Git操作:在多个分支之间,使用git am打patch和同步分支
- java 与sas交互_SAS与MACRO的交互使用
- Kibana安装-源码
- 爬取豆瓣评论连接mysql_Scrapy爬取豆瓣图书数据并写入MySQL
- IT程序猿应该投资些什么
- java8新特性及汪文君Google Guava项目实战
- html 360登录自动填写,汇总:如何在360浏览器中删除自动填写的表单?
- 多媒体计算机的组成元素,什么是多媒体计算机的组成
- 跟着团子学SAP PS:项目计划成本与项目预算设计思路
- Jenkins部署到远程服务器
- 文件锁(一)——文件锁的概述
- 蓝桥杯CT107D:关于矩阵键盘工作原理及其应用
- 计算机专业助我成长作文600,科技伴随我成长作文
- 【硬件】如何使用MOS管作为开关控制?如何看懂参数?如何MOS管选型?(从原理上分析)
- uniapp 实现聊天页面 textarea固定在底部且高度自增