目录

1 数组中的第K个最大元素

1.1 题目解析

1.2 解法

1.3 代码实现

2. 库存管理III

2.1 题目解析

2.2 解法

2.3 代码实现


1 数组中的第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

1.1 题目解析

题目本质

这是一个 选择问题:在一堆数里,不用全排好顺序,只要找到 第 k 大的那个值

  • 我们用三路分区把数分成 < key | == key | > key 三块。

  • 统计“右边比 key 大的个数 c”。

    • 如果 k ≤ c:目标还在右边(更大的区间)。

    • 如果 c < k ≤ c+b:目标就在“等于区间” ⇒ 直接返回 key

    • 如果 k > c+b:说明第 k 大在左边(更小区间),这时要去左边继续找,并把 k -= (c+b)。

    • 停下条件是:k 落在等于区间,结果就是 key。

常规解法
先排序(升序/降序)再取第 n-k / 第 k-1。

问题分析
完整排序复杂度期望 O(n log n),不满足题设“期望 O(n)”。

思路转折
要 O(n) → 只能做快选(QuickSelect)

  • 反复三路分区:把区间按 key 切为 <key | ==key | >key;

  • **找“第 k 大”**时,优先看“右段 >key 的元素个数 c”:

    • 若 k ≤ c → 在右段继续;

    • 若 k ≤ c + b(b 为等于段个数)→ 直接返回 key;

    • 否则 → 去左段,并把 k -= (c + b)(因为这 c+b 个更大的已经被排除在前面)。

1.2 解法

算法思想

三路分区 + 定位“第 k 大”。设

  • b = right - left - 1(等于段大小),

  • c = r - right + 1(大于段大小)。
    决策:

  • k ≤ c → 右段;

  • k ≤ c + b → 返回 key;

  • 否则 → 左段,k = k - (c + b)。

为什么要 k -= (c + b)?

因为递到左段时,前 c + b 个“更大或相等”的元素已经占据了前面的排名,左段内部要找的目标排名相应向前平移。

i)在 [l..r] 内随机取枢轴 key。

ii)三路分区得到三段的边界与大小 b,c。

iii)依据 k 与 c,c+b 的比较,缩小到对应子区间;如进左段要更新 k。

iiii)当命中等于段(k ≤ c + b 且 k > c),返回 key。

易错点 / 踩坑点

  • while (i < right);在 >key 分支交换到 --right 时不要移动 i。

  • 段大小别算错:b = right - left - 1,c = r - right + 1。

  • 递左段要 k -= (c + b);忘了减会错位。

  • 随机下标要含右端点:nextInt(l, r + 1);

  • 缺少递归基判断(l == r) 会引发 bound must be positive。

1.3 代码实现

import java.util.concurrent.ThreadLocalRandom;class Solution {public int findKthLargest(int[] nums, int k) {return qselect(nums, 0, nums.length - 1, k);}// 三路快选:找第 k 大(k 从 1 开始)private static int qselect(int[] nums, int l, int r, int k) {if (l == r) return nums[l];int left = l - 1, right = r + 1, i = l;int key = nums[ThreadLocalRandom.current().nextInt(l, r + 1)];// 三路分区:<key | ==key | >keywhile (i < right) {if (nums[i] < key) {swap(nums, ++left, i++);} else if (nums[i] > key) {swap(nums, --right, i); // i 不动} else {i++;}}// [l, left] < key; [left+1, right-1] == key; [right, r] > keyint b = right - left - 1;   // 等于段int c = r - right + 1;      // 大于段(更大)if (k <= c) {return qselect(nums, right, r, k);            // 在 >key 段} else if (k <= c + b) {return key;                                    // 落在 ==key 段} else {return qselect(nums, l, left, k - (c + b));    // 去 <key 段}}private static void swap(int[] a, int x, int y) {int t = a[x]; a[x] = a[y]; a[y] = t;}
}

复杂度分析

  • 时间:期望 O(N)(随机枢轴,几何级缩小)。

  • 空间:O(1) 额外空间

2. 库存管理III

LCR 159. 库存管理 III - 力扣(LeetCode)

仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限

示例 1:

输入:stock = [2,5,7,4], cnt = 1
输出:[2]

示例 2:

输入:stock = [0,2,3,6], cnt = 2
输出:[0,2] 或 [2,0]

提示:

  • 0 <= cnt <= stock.length <= 10000
    0 <= stock[i] <= 10000

2.1 题目解析

题目本质

这是一个 集合选择问题:不要求有序,只要找出 全局最小的 cnt 个元素

  • 用三路分区分成 < key | == key | > key。

  • 统计左边 < key 的个数 a、等于区间的个数 b。

    • 如果 a ≥ k:目标全在左边,继续递归左段。

    • 如果 a < k ≤ a+b:说明“左边+等于区间”已经覆盖住前 k 个 ⇒ 可以停

    • 如果 a+b < k:说明左边和等于区间还不够 k 个,必须把它们都要了,然后去右边继续找剩余 k - (a+b) 个。

    • 停下条件是:最终需要的前 k 个都落在“小于等于区间”里。这时数组前缀 [0..k-1] 就是结果,虽然内部无序,但保证集合正确。

常规解法
整体排序后取前 cnt;或用堆(大根堆容量 cnt)。

问题分析

  • 排序:O(n log n) 不必要地重排全部。

  • 大根堆:O(n log cnt),当 cnt 接近 n 会偏慢。

思路转折
三路快选(选择)把“前缀”变成全局最小的 cnt(内部可无序):

  • 三路分区得到 <key(a) | ==key(b) | >key;

  • 判断是否已经“覆盖”前缀:当 a + b ≥ cntNeed 时即可停;

  • 若 a ≥ cntNeed → 递左段;

  • 若 a + b < cntNeed → 递右段并 cntNeed -= (a + b)。

2.2 解法

算法思想

在 [l..r] 内反复三路分区,每次决定“继续左/右”或“停”。停下时,数组前缀(全局)即为所需的 cnt 个最小元素(无序)。

i)若 cnt ≤ 0 返回空;若 cnt ≥ n 直接返回拷贝。

ii)l=0, r=n-1, k = cnt(表示“还需收集”的个数)。

iii)三路分区,求 a,b:

  • a ≥ k → 递左段 [l, left];

  • a + b ≥ k → 停(覆盖前缀);

  • 否则 → 递右段 [right, r],k -= (a + b)。

iiii)退出后拷贝前 cnt 个;若需要升序,再对前缀排序。

易错点 / 踩坑点

  • 停条件:本题要“集合”,正确停在 a + b ≥ k。

    • 仅 a ≥ k 时不要直接停,要继续递左段,否则可能错拿左段里较大的元素。

  • 进入右段时别忘了:k -= (a + b)。

  • while (i < right) + >key 分支 不移动 i。

  • 无需完整排序,退出后直接拷贝前 cnt 即可。

2.3 代码实现

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;class Solution {public int[] inventoryManagement(int[] stock, int cnt) {int n = stock.length;if (cnt <= 0) return new int[0];if (cnt >= n) return Arrays.copyOf(stock, n);int l = 0, r = n - 1;int k = cnt; // 还需要的数量while (l <= r) {int left = l - 1, right = r + 1, i = l;int key = stock[ThreadLocalRandom.current().nextInt(l, r + 1)];while (i < right) {if (stock[i] < key) {swap(stock, ++left, i++);} else if (stock[i] > key) {swap(stock, --right, i); // i 不动} else {i++;}}// [l, left] < key; [left+1, right-1] == key; [right, r] > keyint a = left - l + 1;     // <keyint b = right - left - 1; // ==keyif (a >= k) {r = left;                 // 递左段} else if (a + b >= k) {break;                    // 覆盖住了前缀,停} else {k -= (a + b);             // 进入右段继续收集l = right;}}int[] ans = Arrays.copyOf(stock, cnt); // 无序即可// 若需要升序:Arrays.sort(ans);return ans;}private static void swap(int[] a, int x, int y) {int t = a[x]; a[x] = a[y]; a[y] = t;}
}

复杂度分析

  • 时间:期望 O(n);

  • 空间:O(1) 额外空间。

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

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

相关文章

10分钟快速搭建 SkyWalking 服务

从 0 开始入门 SkyWalking&#xff0c;搭建 SkyWalking 服务&#xff0c;并接入 Java 项目中实现分布式链路追踪。 Tags 目录&#xff1a; 1. 概述2. 搭建 SkyWalking 单机环境3. 搭建 SkyWalking 集群环境4. 告警5. 注意事项6. Spring Boot 使用示例 1. 概述 1.1 概念 …

IDEA之GO语言开发

最近因为接到了需求&#xff0c;说是先把目前公司的JAVA服务慢慢替换成GO语言&#xff0c;于是去了解了一下。 但在开发之前&#xff0c;因为用习惯了IDEA&#xff0c;就想着能不能在IDEA上进行开发&#xff0c;结果真让我找到了。 作为学习记录一下 注意&#xff1a;基于IDEA…

rapid_table v3.0.0发布了

更新日志 rapid_table v3.0.0 主要更新是支持 batch 推理&#xff0c;模型并没有升级哈&#xff01; 因为版本号是根据语义化版本号来走的&#xff0c;这次更改了接口的返回值。因此从 v2.0.3 升级到了 v3.0.0。 返回值具体变化如下&#xff1a; # v2.0.3 class RapidTableO…

若依微服务一键部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑与修复全记录)

本文记录我把 高仙&#xff08;Gaussian&#xff09;机器人对接项目 从“本机能跑”迁到 Docker 一键部署 的全过程&#xff1a; 包含 四个后端服务&#xff08;gateway/auth/system/robot&#xff09;、前端 Nginx、MySQL/Redis、Nacos 配置中心、Sentinel 控制台 的改造要点、…

React 业务场景使用相关封装(hooks 使用)

React 业务场景相关方法封装&#xff08;hooks 使用&#xff09; React 中常用的三方 hooks 库 库名特点常见场景官方文档ahooks&#xff08;阿里出品&#xff09;丰富实用的 Hooks&#xff0c;和 Ant Design 配合最佳useRequest&#xff08;请求管理&#xff09;、useDeboun…

[高并发系统设计] - 搭建高并发高可用的系统 - 学习与探究

1.应用场景 主要用于高并发系统设计的架构演进和架构思路。 2.学习/操作 1.文档阅读 搭建高并发、高可用的系统 | Laravel China 社区 高并发&#xff0c; 你真的理解透彻了吗&#xff1f; - 知乎 PHP实战经验之系统如何支撑高并发-51CTO.COM PHP高并发和大流量解决方案整理 …

【小白笔记】Visual Studio 在 2025年7月更新的功能说明(英文单词记忆)

这是NVIDIA软件中关于数据收集&#xff08;Usage Collection&#xff09;的选项。术语解释NVIDIA Nsight Visual Studio Edition&#xff1a;这是一款由NVIDIA开发的工具&#xff0c;专门用于在Visual Studio这个集成开发环境&#xff08;IDE&#xff09;中进行GPU调试和性能分…

THM Whats Your Name WP

信息收集[2025-08-28 21:41:30] [SUCCESS] 端口开放 10.10.208.188:80[2025-08-28 21:41:30] [SUCCESS] 端口开放 10.10.208.188:22[2025-08-28 21:41:31] [SUCCESS] 端口开放 10.10.208.188:8081[2025-08-28 21:41:31] [SUCCESS] 服务识别 10.10.208.188:22 > [ssh] 版本:8…

MySQL底层数据结构与算法浅析

1、概述 MySQL中&#xff0c;当我们发现某个sql的执行时间很长时&#xff0c;最先想到的就是给表加索引&#xff0c;加了索引之后&#xff0c;查询性能就会有显著的提升。 为了知其所以然&#xff0c;那么只有去了解MySQL的底层储存结构和索引的查询算法&#xff0c;只有这样才…

VisualStudio 将xlsx文件嵌入到资源中访问时变String?

如题&#xff0c;就是这么诡异&#xff0c;时至如今已经是visual studio 2022了&#xff0c;你通过界面导入xlsx文件到资源中&#xff0c;它的类型就是String而且没法修改! 即使将文件压缩成zip再导入&#xff0c;依然是String&#xff01; 三哥的骚操作问你服不服! 然而&#…

【视频讲解】R语言海七鳃鳗性别比分析:JAGS贝叶斯分层逻辑回归MCMC采样模型应用

全文链接&#xff1a;https://tecdat.cn/?p43774 原文出处&#xff1a;拓端抖音号拓端tecdat 分析师&#xff1a;Yifei Liu 【视频讲解】R语言海七鳃鳗性别比分析&#xff1a;JAGS贝叶斯分层逻辑回归引言&#xff1a;生态人都懂的痛——样本少、结果被质疑&#xff0c;咋办&am…

Android14 USB子系统的启动以及动态切换相关的init.usb.rc详解

init.usb.rc的作用是在Android系统启动和运行时&#xff0c;通过监听属性&#xff08;sys.usb.config和sys.usb.configfs, sys.usb.typec.mode&#xff09;变化动态&#xff0c;通过写入内核接口 /sys/class/android_usb/ 来配置USB模式。1 USB子系统的启动1.1 on init阶段的配…

宜春城区SDH网图分析

一、SDH网图展示 图片来源&#xff1a; 本地网传输网组SDH网图(2014年12月) - 百度文库 SDH就是Synchronous Digital Hierarchy&#xff0c;同步数字体系的意思。 从分布图可以看出&#xff0c;城区网和工业网一样&#xff0c;是环状结构&#xff0c;保障数据传输的稳定。我的…

lwIP MQTT 心跳 Bug 分析与修复

一、背景在使用 lwIP 内置 MQTT 客户端时&#xff0c;如果你用的是 2.2.0 之前的版本&#xff0c;很可能会遇到一个恼人的问题&#xff1a;客户端和服务器正常连接&#xff0c;但一段时间后 会话被 broker 踢掉。比如常见的现象&#xff1a;Mosquitto / EMQX 日志显示客户端超时…

Golang 面试题「中级」

以下是 100 道 Golang 中级面试题及答案&#xff0c;涵盖并发编程、内存管理、接口实现、标准库深入应用等核心知识点&#xff1a; 一、并发编程基础与进阶问题&#xff1a;Golang 的 GPM 调度模型中&#xff0c;G、P、M 分别代表什么&#xff1f;它们的协作关系是怎样的&#…

沃尔玛AI系统Wally深度拆解:零售业库存周转提速18%,动态定价争议与员工转型成热议点

最近去沃尔玛购物&#xff0c;发现以前总断货的那款早餐麦片居然常年摆在最显眼的货架上&#xff0c;而且价格每周末都会微调——这可不是巧合&#xff0c;背后藏着零售业最硬核的AI操作。沃尔玛去年推出的智能系统Wally&#xff0c;正悄悄改变着我们买东西的体验和商家的运营逻…

AutoDL算力云上传文件太慢了如何解决?

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(2):智慧城市西安与一带一路

PART 01 项目背景01政策与时代背景近年来&#xff0c;随着科技的飞速发展和政策的积极推动&#xff0c;我国新型智慧城市建设取得了显著成效。在“十四五”国家信息化规划中&#xff0c;明确提出要打造智慧高效的城市治理体系&#xff0c;推动城市管理精细化、服务智能化。同时…

MySQL数据库精研之旅第十四期:索引的 “潜规则”(上)

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、索引简介 1.1. 索引是什么 1.2. 为什么需要索引 二、索引应该选择哪种数据结构 2.1. Hash 2.2. 二叉搜索树 2.3. N叉树 2.4. B树 三、MySQL中的页 3.1. 为什么要使用页 3.2. 页文件头和页…

架构设计——云原生与分布式系统架构

** 云原生与分布式系统架构** 5.1 云选型策略&#xff1a;多云、混合云还是单云&#xff1f;如何决定&#xff1f; “上云”已无需讨论&#xff0c;但“上什么云”是第一个战略决策。单云&#xff08;Single Cloud&#xff09;策略&#xff1a; 描述&#xff1a; 将全部资源集中…