第K大的元素:三路快速排序算法思路

Java

https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/di-kda-de-yuan-su-san-lu-kuai-su-pai-xu-im68n/

解题思路

这个题可以利用快速排序算法的隔断思想来解,我们快速排序找到的隔断(partition)在接下来的递归中都不再处理了,因此找到的隔断找到后在哪,排完序之后也是在找到的位置的,从而可以判断k与隔断的大小关系来快速得出第k大的元素在哪。首先同样的,确保第k大的数值在数组中能找到,然后第k大在数组中不好顺序表示,就直接转换成第k小的,例如第1大的可以转换成第length小的,然后因为我这边使用的三路快速排序算法(对全部一样的数值的数组有速度优势),需要传回两个值,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处的元素值。

对三路快速排序算法不太了解的同学可以去了解一下,这边双路应该也是可以实现的。

代码

class Solution {
public int findKthLargest(int[] nums, int k) { if (k > nums.length) { // 如果不存在
return -1;
} // 输入的是找第k大的,转换成找第k小的
k = nums.length-k; // 为分割做准备
Random random = new Random();
int l = 0, r = nums.length; do {
// 获取随机隔断
int rd = random.nextInt(r - l) + l;
swap(nums, rd, l); // 三路快速排序算法
// (l,tl)<V,[tl,i)=V,[i,tg]未处理,(tg,r)>V
int i = l + 1, tl = l + 1, tg = r - 1;
while (i <= tg) {
if (nums[l] > nums[i]) {// 小于V的部分
swap(nums, i, tl);
tl++;
i++;
} else if (nums[l] < nums[i]) {
swap(nums, i, tg);
tg--;
} else { // 等于的部分
i++;
}
}
swap(nums, tl - 1, l);
tl--;
tg++; // [l,tl)<V, [tg,r)>V, [tl,tg) = V if (k >= tl && k < tg) {
return nums[k];
} else if (k < tl) {
r = tl;
} else {
l = tg;
}
}
while (true);
} private void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}

【数据结构与算法】第K大的元素:三路快速排序算法思路的更多相关文章

  1. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  2. LeetCode703 流中第k大的元素

    前言: 我们已经介绍了二叉搜索树的相关特性,以及如何在二叉搜索树中实现一些基本操作,比如搜索.插入和删除.熟悉了这些基本概念之后,相信你已经能够成功运用它们来解决二叉搜索树问题. 二叉搜索树的有优点是 ...

  3. [LeetCode] Kth Largest Element in a Stream 数据流中的第K大的元素

    Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...

  4. 输出数组第k大的元素

    用快速排序的思想输出数组第k大的元素: #include<iostream> #include<algorithm> using namespace std; //递归实现:返 ...

  5. 获取一个数组里面第K大的元素

    如何在O(n)内获取一个数组比如{9, 1, 2, 8, 7, 3, 6, 4, 3, 5, 0, 9, 19, 39, 25, 34, 17, 24, 23, 34, 20}里面第K大的元素呢? 我 ...

  6. 2.4 选择第k大的元素 selection

    1.目标:找到N个元素中,第k大的数. 例如:max是k=N--1:min是k=0:median是k=N/2 2.Quick-select 借鉴了快速排序的思想 (1)利用partition保证: ① ...

  7. POJ 2985 Treap平衡树(求第k大的元素)

    这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...

  8. kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

    一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...

  9. C++11新特性应用--介绍几个新增的便利算法(不更改容器中元素顺序的算法)

    总所周知.C++ STL中有个头文件,名为algorithm.即算法的意思. The header<algorithm>defines a collection of functions ...

  10. 力扣:丑数II和数组中前K大的元素

    数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...

随机推荐

  1. CDS标准视图:催款冻结描述 I_DunningBlockingReasonText

    视图名称:催款冻结描述 I_DunningBlockingReasonText 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Dunning Blocking ...

  2. CDS标准视图:维护通知原因数据 I_MaintNotificationCauseData

    视图名称:维护通知原因数据 I_MaintNotificationCauseData 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'INOTIFCAU ...

  3. 使用坦克PWA访问助手为自己的局域网应用快速配置免费域名

    这篇教程描述如何使用坦克PWA访问助手.这篇文章简称坦克PWA访问助手为PWA助手.PWA结合了DNS服务器技术和HTTP服务器技术实现,因此它需要系统的53端口和80端口.所以,如果你的电脑有程序占 ...

  4. VS中无法识别unistd.h的问题

    问题 VS 无法打开源文件 unistd.h 参考:链接 方法 许多在Linux下开发的C程序都需要头文件unistd.h,但VC中没有个头文件,所以用VC编译总是报错.把下面的内容保存为unistd ...

  5. Symbolic pg walkthrough Intermediate window 利用302进行文件csrf

    nmap nmap -p- -A -sS -T4 192.168.239.177 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-15 03:39 ...

  6. ELB UDP健康检查常见故障分析

    本文分享自天翼云开发者社区<ELB UDP健康检查常见故障分析>,作者:王****宁 什么是UDP健康检查 UDP是面向非连接的一种协议,在发送数据前不会通过进行三次握手建立连接,UDP健 ...

  7. 将文件转换为文件流进行上传(例:通过HDMI进行传输)

    package com.boottest.app; import org.apache.commons.codec.Charsets; import org.apache.http.HttpEntit ...

  8. Windows的MySQL数据库升级(解压包方式)

    1.背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 . 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞. 因为 MySQL 的官方补丁,需要 Oracle 的 si ...

  9. 打工人最强福音上线!AOne终端全面接入DeepSeek大模型!

    DeepSeek深度融合国产AI生态,国云连放大招! 继天翼云多款产品上线DeepSeek后, 见证企业级智能办公的时刻来了! 天翼云AOne联合国产大模型王者DeepSeek 带着671B满血版.7 ...

  10. Qt Json序列化与反序列化

    Qt Json序列化与反序列化 Qt的一个用于序列化与反序列化的库 xpack,也可用于c++. 使用方法 下载库文件 xpack 标签 - Gitee.com 按照它的默认样子放好,建议单独放一个文 ...