当前位置: 首页 > news >正文

LeetCode 378 有序矩阵中第 K 小的元素 - 指南

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 为什么这是“二分答案”的题
      • 统计 ≤ mid 的元素个数
      • Swift 可运行 Demo 代码
      • 代码拆解说明
        • 1. 为什么 `left` 和 `right` 这样初始化
        • 2. `count < k` 为什么要 `left = mid + 1`
        • 3. 为什么最后直接返回 `left`
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

LeetCode 378「有序矩阵中第 K 小的元素」是一道非常容易被写“重”的题

很多人第一反应是:

既然矩阵是有序的,那我全部摊平成数组,再排序不就好了?

没错,能过,但空间复杂度直接炸到 O(n²),而题目明确告诉你:

你必须用更省内存的方式。

这道题真正考的不是排序,而是你有没有意识到:
“答案本身也是有序的,可以用二分去猜。”

这篇文章会重点讲清楚:

  • 为什么这是一个“对值域做二分”的问题
  • 为什么不需要真的把第 k 个元素找出来
  • Swift 下如何写出一个稳定、易读的实现

描述

题目给你一个 n x n 的矩阵 matrix,并保证:

注意这里有一个很重要的点:

它不是整体排序后的第 k 个“不同元素”,
而是 排序后的位置第 k 个元素

比如:

[1,5,9,10,11,13,12,13,15]

展开后是:

[1,5,9,10,11,12,13,13,15]

第 8 个元素是 13,而不是跳过重复。

题解答案

这道题最主流、也最稳妥的解法是:

对值域做二分查找 + 利用矩阵有序性统计 ≤ mid 的元素个数

核心思路一句话总结:

  • 矩阵是有序的
  • 第 k 小的值,一定在 [最小值, 最大值] 这个区间里
  • 我们不关心它在哪,只关心 “小于等于某个值的数有多少个”

题解代码分析

为什么这是“二分答案”的题

很多人卡在一个误区里:

二分不是只能用在数组索引上吗?

其实不是。
只要答案满足单调性,就能二分。

在这道题中:

  • 值越小

    • ≤ 这个值的元素数量越少
  • 值越大

    • ≤ 这个值的元素数量越多

这是一个天然的单调关系。

统计 ≤ mid 的元素个数

这是整道题最关键的地方。

因为矩阵行列都有序,我们可以这样做:

这个过程是 O(n) 的。

Swift 可运行 Demo 代码

class Solution {
func kthSmallest(_ matrix: [[Int]], _ k: Int) -> Int {
let n = matrix.count
var left = matrix[0][0]
var right = matrix[n - 1][n - 1]
while left < right {
let mid = left + (right - left) / 2
let count = countLessOrEqual(matrix, mid)
if count < k {
left = mid + 1
} else {
right = mid
}
}
return left
}
private func countLessOrEqual(_ matrix: [[Int]], _ target: Int) -> Int {
let n = matrix.count
var row = n - 1
var col = 0
var count = 0
while row >= 0 && col < n {
if matrix[row][col] <= target {
count += row + 1
col += 1
} else {
row -= 1
}
}
return count
}
}

代码拆解说明

1. 为什么 leftright 这样初始化
var left = matrix[0][0]
var right = matrix[n - 1][n - 1]

因为:

  • 矩阵整体是有序的
  • 左上角是最小值
  • 右下角是最大值

这是值域的天然边界

2. count < k 为什么要 left = mid + 1

这一步非常关键。

含义是:

  • 当前 mid 太小
  • 小于等于 mid 的元素还不够 k
  • 第 k 小的数一定在右边
3. 为什么最后直接返回 left

因为循环结束条件是:

left == right

而这个值,刚好是:

第一个满足“≤ 它的元素个数 ≥ k”的数

也就是第 k 小的元素。

示例测试及结果

let solution = Solution()
print(solution.kthSmallest([[1,5,9],[10,11,13],[12,13,15]], 8))
// 13
print(solution.kthSmallest([[-5]], 1))
// -5

输出结果:

13
-5

时间复杂度

  • 二分次数:log(maxValue - minValue)
  • 每次统计:O(n)

整体复杂度:

O(n * log(range))

n <= 300 的限制下,非常安全。

空间复杂度

除了几个变量,没有额外数据结构:

O(1)

完全满足题目的进阶要求。

总结

LeetCode 378 是一道非常适合用来训练“二分答案思维”的题

  • 不在数组上二分
  • 而是在“可能的结果范围”上二分

这种思路在实际开发中也很常见,比如:

  • 资源分配的最小可行值
  • 系统阈值调优
  • 延迟、吞吐量的临界点搜索

如果你能把这道题讲清楚,
那你对“二分”的理解,已经明显高于只会套模板的人了。

http://www.jsqmd.com/news/389556/

相关文章:

  • 2026年口碑好的H型钢管/贵州H型钢管热门厂家推荐汇总 - 行业平台推荐
  • 手把手教你用REX-UniNLU做社交媒体情感监测
  • 2026年知名的上海低碳矿山/智慧矿山实力推荐榜厂家 - 行业平台推荐
  • OFA-large模型使用教程:Pillow+requests图片加载与英文文本预处理要点
  • 基于EmbeddingGemma-300m的语义搜索系统开发实战
  • Janus-Pro-7B论文精读:解读统一多模态架构设计思想
  • 人工智能应用- 推荐算法:01. 什么是推荐算法
  • 实测才敢推 10个降AIGC软件测评:MBA降AI率必备工具推荐
  • 人工智能应用- 推荐算法:02.推荐算法的基本思想
  • translategemma-27b-it图文教程:Ollama安装与多语言翻译实战
  • 这次终于选对!10个AI论文平台测评:研究生毕业论文与科研写作必备工具推荐
  • ERNIE-4.5-0.3B-PT持续学习方案:灾难性遗忘应对策略
  • 2026必备!10个AI论文网站深度测评,自考毕业论文写作与格式规范全攻略
  • 2026年老工厂车间升级改造浙江标准化工厂布局/标准化工厂布局用户认可推荐企业 - 行业平台推荐
  • 互联网大厂Java面试实录:智慧城市场景下的核心技术与AI应用
  • 2026年比较好的洗衣机柜一体盆/异形洗衣机柜定制源头直供参考哪家便宜 - 行业平台推荐
  • 2026年口碑好的西安一体盆洗衣柜/整体阳台洗衣柜销售厂家推荐哪家好(真实参考) - 行业平台推荐
  • 2026年口碑好的防晒洗衣柜/西安洗衣柜畅销厂家采购指南如何选 - 行业平台推荐
  • 真的太省时间!继续教育专属的一键生成工具 —— 千笔写作工具
  • 2026年口碑好的石英石台面橱柜/厨房橱柜定做生产商实力参考哪家质量好(更新) - 行业平台推荐
  • DeepSeek写论文AI率99%怎么急救?3步降到安全线(实测有图)
  • 别再瞎找了!8个降AI率软件降AIGC网站:继续教育必备测评与推荐
  • 基于SpringBoot+协同过滤推荐算法+智能AI推荐的影院票务管理平台开题报告
  • 2026年评价高的双联齿轮滚齿机/行星齿轮滚齿机哪家强生产厂家实力参考 - 行业平台推荐
  • 写作小白救星!千笔AI,深得人心的降AIGC工具
  • 2026降AI工具第一梯队盘点:哪些值得花钱?哪些在割韭菜?
  • LeetCode401:二进制手表
  • ChatGPT、Claude、Gemini三大AI写的论文怎么降AI?一篇搞定所有主流模型
  • 科研党收藏!AI论文软件 千笔 VS 灵感ai,MBA写论文神器!
  • Qwen3-Embedding-4B实操教程:知识库语义聚类+自动标签生成工作流