【数据结构与算法】找出最小的k个数:三路快速排序算法思想实现
找出最小的k个数:三路快速排序算法思想实现
Java
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/zui-xiao-de-kge-shu-san-lu-kuai-su-pai-x-5xro/
https://leetcode-cn.com/problems/smallest-k-lcci/solution/zui-xiao-kge-shu-san-lu-kuai-su-pai-xu-s-ns7y/
解题思路
本题类似找第K大的值的思路,同学们可以看看我关于那题的解法。同样的,找出最小的k个数也可以用快速排序算法的思路来解题。因为快速排序算法的隔断(partition)是排序好之后的位置固定不变了的,然后在这之前的是小于隔断的值,在这之后是大于隔断的值,那找出最小的k个数不就通过快速排序算法的隔断找到k的位置,然后返回在这之前的值组成的数组就行。
首先同样的,确保最小的k个数在数组中能找到,因为我这边使用的三路快速排序算法(对全部一样的数值的数组有速度优势),需要传回两个值,Java不支持多变量返回,我就直接写在一个函数里了,首先是初始化好相关变量,约定好隔断:V,(l,tl)<V,[tl,i)=V,[i,tg]未处理,(tg,r)>V,然后遍历[l,r),把相对应的元素放置到对应位置,最后处理隔断V,处理好之后就变成了[l,tl)<V, [tg,r)>V, [tl,tg) = V,这样,我们再判断k在哪个区间,如果是在等于V的区间,V是已经排好序了的,那就可以直接返回,在小于V的区间就调整r值后再次找隔断,同理大于V则调整l之后再调整,这样一步一步就能得到k处的元素值。找到K所在的位置之后,小于它的元素就都在它前面了,直接复制到新数组返回就好了。
对三路快速排序算法不太了解的同学可以去了解一下,这边双路应该也是可以实现的。
代码
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if(k>=arr.length){
return arr;
}
Random random = new Random();
int l = 0,r = arr.length;
// [l,r)
while (true){
int rd = random.nextInt(r-l)+l;
swap(arr,rd,l);
// (l,tl)<V,(tg,r)>V,[i,tg]未处理,[tl,i) = V
int i=l+1,tl = l+1,tg=r-1;
while (i<=tg){
if(arr[i]>arr[l]){
swap(arr,tg,i);
tg--;
}else if(arr[i]<arr[l]){
swap(arr,tl,i);
tl++;
i++;
}else {
i++;
}
}
tl--;
swap(arr,tl,l);
// [l,tl)<V,(tg,r)>V,[tl,tg] = V
tg++;
// [l,tl)<V,[tg,r)>V,[tl,tg) = V
if(k>=tl&&k<=tg){
return Arrays.copyOf(arr,k);
}else if(k<tl){
r = tl;
}else {
l = tg;
}
}
}
private void swap(int[] arr,int i,int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
【数据结构与算法】找出最小的k个数:三路快速排序算法思想实现的更多相关文章
- 找出最小的k个数
•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中 ...
- 编程题目: 找出最小的k个数
找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...
- 数组中找出最小的K个数
题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...
- 算法题解:最小的K个数(海量数据Top K问题)
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n ...
- 算法练习-寻找最小的k个数
练习问题来源 https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/02.01.html 要求 输入n个整数, ...
- 华为OJ平台——输出最小的k个数
输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...
- 剑指Offer 29. 最小的K个数 (其他)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...
- 剑指:最小的k个数
题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...
- Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...
- 剑指Offer面试题:27.最小的k个数
一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...
随机推荐
- 【转】Java操作Excel竟然这么简单!
最近项目需求需要用到操作Excel的功能,之前使用POI实现,但是数据量大了之后支持不是很好,所以就在网上找找资源,果不其然,如下: 原文链接:没想到啊,Java操作Excel竟然这么简单!
- CDS标准视图:维护任务清单数据 I_MaintenanceTaskListData
视图名称:维护任务清单数据 I_MaintenanceTaskListData 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IPMTASKLISTD ...
- Java方法引用、lambda如何序列化&方法引用与lambda底层原理
系列文章目录和关于我 0.引入 最近笔者使用flink实现一些实时数据清洗(从kafka清洗数据写入到clickhouse)的功能,在编写flink作业后进行上传,发现运行的时候抛出:java.io. ...
- 使用GTD工作法提升效率
前言 近年来随着工作.副业的开展,每天要做的事情越来越多,而且还积攒了很多工作,每天大脑被各种事情充斥着,乱糟糟的,不仅效率很低,还很容易导致焦虑. 为此我一直有在寻找合适的项目管理工具,也看了一些相 ...
- 6种微服务RPC框架-copy
一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末 ...
- w3cschool-XML教程
参考https://www.w3cschool.cn/xml/ XML 教程 让我们先来简单的了解一下 XML: XML 指可扩展标记语言(eXtensible Markup Language). X ...
- 学习shamir秘密分享
介绍 1979年Shamir在下文提出基于拉格朗日插值多项式的\((r,n)\)秘密共享方案(\(0<r \leq n\)).秘密拥有者通过构建一元多项式将秘密分为\(n\)份,接收方收集大于等 ...
- uni-app封装网络请求promise
在项目的根目录下,创建http文件夹. 然后在创建request.js文件 文件代码如下 export function apiapi(myurl,myget,mydata,tou="Acc ...
- WAIC 2024盛大召开,天翼云以全栈智算能力赋能AI时代!
7月5日,2024世界人工智能大会期间,中国电信星辰人工智能生态论坛在上海世博中心启幕.论坛以"星辰注智,焕新领航"为主题,围绕人工智能技术发展趋势,分享中国电信与产业各界在人工智 ...
- 服务器通用背板管理(UBM)实现
本文分享自天翼云开发者社区<服务器通用背板管理(UBM)实现>,作者: 乘风 一 UBM概述 通过SGPIO 进行 SAS 和 SATA 背板管理的 SCSI 机箱服务 (SES) 标准于 ...