找出最小的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个数:三路快速排序算法思想实现的更多相关文章

  1. 找出最小的k个数

    •已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中 ...

  2. 编程题目: 找出最小的k个数

    找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...

  3. 数组中找出最小的K个数

    题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...

  4. 算法题解:最小的K个数(海量数据Top K问题)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n ...

  5. 算法练习-寻找最小的k个数

    练习问题来源 https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/02.01.html 要求 输入n个整数, ...

  6. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  7. 剑指Offer 29. 最小的K个数 (其他)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...

  8. 剑指:最小的k个数

    题目描述 输入 n 个整数,找出其中最小的 K 个数.例如输入 4,5,1,6,2,7,3,8 这 8 个数字,则最小的 4 个数字是 1,2,3,4. 解法 解法一 利用快排中的 partition ...

  9. Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法

    最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...

  10. 剑指Offer面试题:27.最小的k个数

    一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...

随机推荐

  1. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-11- 标签页(tab)操作 - 下篇 (详细教程)

    1.简介 本来按照计划这一系列的文章应该介绍Context和Page两个内容的,但是宏哥看了官方文档和查找资料发现其实和宏哥在Python+Playwright系列文章中的大同小异,差不了多少,再在这 ...

  2. Solution -「AGC 020F」Arcs on a Circle

    \(\mathscr{Description}\)   Link.   在一个周长为 \(c\) 的圆周上放置长度分别为 \(l_1,l_2,\cdots,l_n\) 的弧,每条弧的位置独立均匀随机. ...

  3. 隐私集合求交(PSI)-两方

    在知乎上看到大佬写的关于论文:Efficient Batched Oblivious PRF with Applications to Private Set Intersection的讲解,循序渐进 ...

  4. Access pg walkthrough Intermediate window域渗透

    namp nmap -p- -A -sS -T4 192.168.200.187 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-23 00 ...

  5. ADALM-Pluto修改芯片类型为AD9364模式

    ADALM-Pluto 使用芯片AD9363(325 MHz - 3.8 GHz),但可切换至 AD9364(70 MHz - 6 GHz)模式,此篇随笔将采用串口调试的方式将 Pluto 设置为 A ...

  6. changeServer.sh一键切换服务器脚本

    直接看改进版2.0 切换服务器,免密登录vi changeServer.sh #!/bin/bash #authe by wangxp export IFCFG=/etc/sysconfig/netw ...

  7. Luogu P3041 USACO12JAN Video Game G 题解 [ 紫 ] [ AC 自动机 ] [ 动态规划 ]

    Video Games G:弱智紫题,30min 切了,dp 思路非常板. 多模式串一看肯定就是要建出 AC 自动机,然后在 fail 树里下传标记,预处理每个节点到达后的得分. 然后设计 \(dp_ ...

  8. CAP与BASE:分布式系统设计的灵魂与妥协

    CAP 理论 CAP理论起源于 2000 年,由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会(PODC)上提出,因此 CAP 定理又被称作 布鲁尔定理(Brewer's t ...

  9. DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地

    对于个人开发者或尝鲜者而言,本地想要部署 DeepSeek 有很多种方案,但是一旦涉及到企业级部署,则步骤将会繁琐很多. 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型, ...

  10. C# Graphic 操作记录

    C# 在图片上绘制文字 /// <summary> /// 生成文字图片 /// </summary> /// <param name="text"& ...