快排解决寻找数组中的第K个最大元素
时间:2022-07-22
本文章向大家介绍快排解决寻找数组中的第K个最大元素,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
这是一个来自 leetcode 的题目,有很多的解决方式,属于排序类的问题。排序类的算法大致就这些几种 排序算法,可以解决这个问题的比如冒泡排序、堆排序、快排等。最近有参与了几场面试,快排的伪代码也大概写了 3 次了,这次决定要使用快排解决这个问题。
class Solution {
private $k_size;
private $count = 0;
/**
* @param Integer[] $nums
* @param Integer $k
* @return Integer
*/
function findKthLargest($nums, $k) {
$right = sizeof($nums);
$this->quickSort($nums, 0, $right-1);
return $nums[$right-$k];
}
function quickSort(&$data, $start, $end) {
if($start >= $end)
return;
$i = $start;
$j = $end;
$key = $data[$i]; //快排的枢纽元素,这里只简单取了第一个元素作为枢纽元,快排的效率可能很受影响
while($i<$j) {
while($i<$j && $data[$j] > $key)
$j--;
while($i<$j && $data[$i] <= $key)
$i++;
if ($j != $i)
list($data[$i], $data[$j]) = array($data[$j], $data[$i]);
}
list($data[$start], $data[$j]) = array($data[$j], $data[$start]); //快排最后的操作,以枢纽元为分割点,左边的元素小于枢纽元,右边的元素大于枢纽元
$this->quickSort($data,0,$i-1);
$this->quickSort($data,$i+1,$end);
}
}
上面使用了比较简洁、易懂的 PHP 代码,使用快排的思想对元素进行排序。我提交了代码,但是最后一个测试用例没有通过,所以考虑优化的方向。
很显然既然是找第 K 个最大元素,小于 K 的数据我就没有必要对他们就行快排,所以在后面两行加上一个条件可以避免很多没必要的操作。代码我就不贴了,贴一个我看的不太懂的一个。
class Solution {
private $k_size;
private $count = 0;
/**
* @param Integer[] $nums
* @param Integer $k
* @return Integer
*/
function findKthLargest($nums, $k) {
$this->k_size = $k;
return $this->quickSort($nums, 0, count($nums)-1);
}
function quickSort(&$nums, $q, $r) {
if($q >= $r) return $nums[$q];
$i = $j = $q;
//生成随机数(枢纽元选取,快排更稳定)
$mtrand = mt_rand($q, $r);
$tmp = $nums[$mtrand];
$nums[$mtrand] = $nums[$r];
$nums[$r] = $tmp;
while($j<$r){
if($nums[$j]>$nums[$r]){
list($nums[$i],$nums[$j]) = [$nums[$j],$nums[$i]];
++$i;
}
++$j;
}
list($nums[$i],$nums[$j]) = [$nums[$j],$nums[$i]];
if($i+1 == $this->k_size) return $nums[$i];
if($i+1>$this->k_size) return $this->quickSort($nums, $q, $i-1);
return $this->quickSort($nums, $i+1, $r);
}
}
参考《数据结构与算法分析》 第七章 《排序》
- INET_ATON()函数在MySQL5.6版本和5.7版本的差异
- Linux主机之间ssh免密登录配置
- 远控木马Posion Ivy开始肆虐缅甸和其它亚洲国家
- Slf4j+Logback配置文件变量使用小记
- Storm消息处理可靠性保证
- git+github创建分支&提交并贡献代码(linux环境)
- 使用Nginx代理restful实现SSL链路加密
- 使用Nginx代理thrift NIO实现SSL链路加密
- TThreadedSelectorServer介绍及Direct Memory OOM分析
- 通过Java程序提交通用Mapreduce任务并获取Job信息
- Mapreduce 任务提交源码分析1
- Java分布式神经网络库Deeplearning4j 环境搭建和运行一个例子
- Java分布式神经网络库Deeplearning4j之上手实践手写数字图像识别与模型训练
- 调用腾讯优图开放平台进行人脸识别-Java调用API实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python 入门笔记[语法基础(上)]
- 怎样解决 JavaScript 生态中第三方安全性问题?
- 【Hadoop 分布式部署 十:配置HDFS 的HA、启动HA中的各个守护进程】
- 【Hadoop 分布式部署 十 一: NameNode HA 自动故障转移】
- Hive安装部署及简单测试 网页《一》
- Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》
- Python - lambda函数
- Oracle 基础学习笔记
- 算法【最大子序列问题】
- 【算法、递归回溯解决数独】
- Anaconda使用命令
- 最大连续子数组
- markdown编辑器实现代码高亮
- LeetCode - 198 简单动态规划 打家劫舍
- Jaskson精讲第7篇-JsonTypeInfo注解在类继承关系下的使用