第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. 前端学习openLayers配合vue3(简单的创建一个地图)

    首先搭建一个vue工程化环境,首先我们先来创建一个地图吧 首先我们需要下载 npm i ol 其次我们需要在main.js里面引入相关的css import 'ol/ol.css' 到现在我们就可以开 ...

  2. 深入解析 Spring AI 系列:剖析OpenAI接口接入组件

    今天我们将继续探讨如何在Spring AI中接入大语言模型,以OpenAI为例,详细分析其接入过程.我们将逐步探讨OpenAI是如何与Spring AI系统对接的,具体包括如何配置接口.如何封装接口参 ...

  3. 【译】在分析器中使用 Meter Histogram(直方图)解锁见解

    您是否正在与应用程序中的性能瓶颈作斗争?不要再观望了!Visual Studio 2022 在其性能分析套件中引入了 Meter Histogram(直方图)功能,为您提供了前所未有的分析和可视化直方 ...

  4. java基础知识回顾之java Socket学习

    UDP传输:面向无连接的协议,不可靠,只是把应用程序传给IP层的数据报包发送出去,不保证发送出去的数据报包能到达目的地.不用再客户端和服务器端建立连接,没有超时重发等机制,传输速度快是它的优点.就像寄 ...

  5. linux:搭建 WordPress 个人站点

    参考:链接 介绍 WordPress 是一款使用 PHP 语言开发的博客平台,您可使用通过 WordPress 搭建属于个人的博客平台.本文以 CentOS 6.5 操作系统为例,手动搭建 WordP ...

  6. Vmware共享文件夹安装设置方法(window与Linux使用共享文件夹)

    Vmware共享文件夹安装设置方法 注意:如果按照了工具,设置了共享文件夹,Linux下面还是没有的话,可以运行下面的命令,就会加载共享文件夹了 vmhgfs-fuse .host:/ /mnt/hg ...

  7. windows系统之netstatt、telnet、tasklist taskkill四大常用网络运维命令

    windows系统之netstatt.telnet.tasklist  taskkill 四大常用网络运维命令 Netstat 查看网络状态信息 [用法格式] NETSTAT [-a] [-b] [- ...

  8. Q:群晖磁盘断电导致,无法访问系统分区

    1.群晖磁盘断电导致,无法访问系统分区 2.点击存储空间管理员-总览-点击修复 3.存储空间-文件系统检查-重启 4.重启后正常

  9. .NET最佳实践:避免同步读取HttpRequest

    为什么要避免同步读取 ASP.NET Core 中的所有 I/O 操作都是异步的.服务器实现了 Stream 接口,该接口同时具备同步和异步的方法. 在进行 I/O 操作时,应优先使用异步方法,以避免 ...

  10. Flink同步kafka到iceberg数据延迟,两个checkpoint后才可查询

    一.问题描述 用户配置了高级参数很多,观察kafka增量数据不多,flink负载不高情况下两个checkpoint后才可查询到数据.   排查时hdfs有数据文件产生,但是mainfast文件中最新快 ...