数组中第K个最大元素(算法村第十关白银挑战)

215. 数组中的第K个最大元素 - 力扣(LeetCode)

给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

6-4 随机选择切分元素_哔哩哔哩_bilibili

public int findKthLargest(int[] nums, int k){// 第 1 大的数,下标是 len - 1;// 第 2 大的数,下标是 len - 2;// ...// 第 k 大的数,下标是 len - k;int targetPos = nums.length - k;int low = 0;int high = nums.length - 1;while (true){int pivotPos = partition(nums, low, high);if(pivotPos == targetPos)return nums[pivotPos];else if(pivotPos < targetPos)low = pivotPos + 1;elsehigh = pivotPos - 1;}}public static int partition(int[] nums, int low, int high)
{//取(子)序列第一个元素为基准元素int pivot = nums[low];  //此时 low 为坑位while (low < high){//先从右边找,填补左边的坑位while (low < high && nums[high] >= pivot)high--;nums[low] = nums[high]; //而后 high 成了坑位//再从左边找,填补右边的坑位while (low < high && nums[low] <= pivot)low++;nums[high] = nums[low];}nums[low] = pivot; //或 nums[high] = pivotreturn low; //或 return high
}

执行用时:2608 ms

优化 partition

在这里插入图片描述

public static Random random = new Random(System.currentTimeMillis());public static int partition_2(int[] nums, int low, int high)
{//在 [low, high] 中随机取一个位置 randomPos, 将 nums[randomPos] 设为pivotint randomPos = low + random.nextInt(high - low + 1);//仍然将 low 设为坑位swap(nums,low,randomPos);	//交换 low 和 randomPos 位置上的数int pivot = nums[low];while (low < high){//先从右边找,填补左边的坑位while (low < high && nums[high] >= pivot)high--;nums[low] = nums[high]; //而后 high 成了坑位//再从左边找,填补右边的坑位while (low < high && nums[low] <= pivot)low++;nums[high] = nums[low];}nums[low] = pivot; //或 nums[high] = pivotreturn low; //或 return high
}public static void swap(int[] nums, int i, int j)
{int t = nums[i];nums[i] = nums[j];nums[j] = t;
}

执行用时:853 ms

算法还能再优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/419155.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM工作原理与实战(二十一):内存管理

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、不同语言的内存管理 1.C/C的内存管理 2.Java的内存管理 二、垃圾回收的对比 1.自动垃圾回收与手动垃圾回收的对比 2.优点与缺点 总结 前言 JVM作为Java程序的运行环境&#…

Golang 搭建 WebSocket 应用(八) - 完整代码

本文应该是本系列文章最后一篇了&#xff0c;前面留下的一些坑可能后面会再补充一下&#xff0c;但不在本系列文章中了。 整体架构 再来回顾一下我们的整体架构&#xff1a; 在我们的 demo 中&#xff0c;包含了以下几种角色&#xff1a; 客户端&#xff1a;一般是浏览器&am…

XSS漏洞:利用多次提交技巧实现存储型XSS

目录 搭建环境 XSS攻击 测试 xss系列往期文章&#xff1a; 初识XSS漏洞-CSDN博客 利用XSS漏洞打cookie-CSDN博客 XSS漏洞&#xff1a;xss-labs靶场通关-CSDN博客 XSS漏洞&#xff1a;prompt.mi靶场通关-CSDN博客 XSS漏洞&#xff1a;xss.haozi.me靶场通关-CSDN博客 本…

磁盘分区机制

lsblk查看分区 Linux分区 挂载的经典案例 1. 虚拟机增加磁盘 点击这里&#xff0c;看我的这篇文章操作 添加之后&#xff0c;需要重启系统&#xff0c;不重启在系统里看不到新硬盘哦 出来了&#xff0c;但还没有分区 2. 分区 还没有格式化 3. 格式化磁盘 4. 挂载 5. 卸载…

汇编语言----X86汇编指令

目录 1.汇编指令的构成 2.X86架构CPU中包含的寄存器 3.常见的x86汇编指令 &#xff08;1&#xff09;算数运算 &#xff08;2&#xff09;逻辑运算 &#xff08;3&#xff09;其他 4.AT&T格式 5.选择语句&#xff08;分支结构&#xff09; 6.循环语句 &#xff0…

huggingface学习 | 云服务器使用hf_hub_download下载huggingface上的模型文件

系列文章目录 huggingface学习 | 云服务器使用git-lfs下载huggingface上的模型文件 文章目录 系列文章目录一、hf_hub_download介绍二、找到需要下载的huggingface文件三、准备工作及下载过程四、全部代码 一、hf_hub_download介绍 hf_hub_download是huggingface官方支持&…

Linux中的共享内存

定义&#xff1a; 共享内存允许两个或者多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;。由于一个共享内存段会称为一个进程用户空间的一部分&#xff0c;因此这种 IPC 机制无需内核介入。所有需要做的就是让一个进程将数 据复制进共享内存中&#xff…

力扣精选算法100题——串联所有单词的字串(滑动窗口专题)

本题链接——串联所有单词的字串 本题和找到字符串中所有字母异位词题目非常相似&#xff0c;思路都是一样。通过自己的大脑能发现其中的相似之处。 第一步&#xff1a;了解题意 就按实例来分析吧&#xff0c;这样更通俗易懂。 words["ab","cd","ef…

mysql从库重新搭建的流程

背景 生产环境上的主从集群&#xff0c;因为一些异常原因&#xff0c;导致主从同步失败。现记录下通过重做mysql从库的方式来解决&#xff0c;重做过程不影响主库。 步骤 1、在主库上的操作步骤 备份主库所有数据&#xff0c;并将dump.sql文件拷贝到从库/tmp目录 mysqldump …

Flutter 综述

Flutter 综述 1 介绍1.1 概述1.2 重要节点1.3 移动开发中三种跨平台框架技术对比1.4 flutter 技术栈1.5 IDE1.6 Dart 语言1.7 应用1.8 框架 2 Flutter的主要组成部分3 资料书籍 《Flutter实战第二版》Dart 语言官网Flutter中文开发者社区flutter 官网 4 搭建Flutter开发环境参考…

vue3-模版引用

模版引用 ref 属性 场景&#xff1a;需要直接访问底层 DOM 元素。 方法&#xff1a;使用特殊的 ref 属性。 <input ref"input">ref 属性 允许我们在一个特定的 DOM 元素或子组件实例被挂载后&#xff0c;获得对它的直接引用。 访问模板引用 小 Demo: 当 i…

Go 知识iota

Go 知识iota 1. 介绍2. 特性3. 原理4. 你真的理解了吗 1. 介绍 iota 是一个预定义的标识符&#xff0c;用于声明枚举常量。它在 const 声明中使用&#xff0c;表示连续的未类型化整数。其值从0开始&#xff0c;const声明块每增加一行&#xff0c;iota的值就会自增1&#xff0c…