腾讯面试手撕题:返回行递增有序矩阵第k小的元素

article/2025/6/20 21:32:14

题目

给定一个n行n列的矩阵,这个矩阵的每一行是递增有序的,求这个矩阵中第k小的元素。

解答

优解

基于二分查找和按行统计小于等于目标值的元素个数。算法的时间复杂度为O(nlognlogD),其中D是矩阵中元素值域的范围(即最大值与最小值的差),空间复杂度为O(1)(不包括输入矩阵)。

算法描述
  1. 确定值域范围

    • 计算矩阵中的最小值 min_val:取所有行首元素(即每行的第一个元素)的最小值,即 min_val = min(matrix[i][0] for i in range(n))

    • 计算矩阵中的最大值 max_val:取所有行尾元素(即每行的最后一个元素)的最大值,即 max_val = max(matrix[i][n-1] for i in range(n))

    • 初始化二分查找的左边界 left = min_val,右边界 right = max_val

  2. 二分查找第 k 小元素

    • 当 left < right 时,执行循环:

      • 计算中间值 mid = (left + right) // 2(整数除法)。

      • 统计矩阵中小于等于 mid 的元素个数 count

        • 对于每一行 i(因为行是递增有序),使用二分查找找到该行中最后一个小于等于 mid 的元素的列索引 j(即最大的 j 满足 matrix[i][j] <= mid)。则该行中小于等于 mid 的元素个数为 j+1(列索引从 0 开始)。

        • 对所有行的结果求和,得到 count

      • 如果 count >= k,则第 k 小元素小于等于 mid,设置 right = mid

      • 否则,第 k 小元素大于 mid,设置 left = mid + 1

    • 循环结束后,left 即为第 k 小元素的值。

算法正确性
  • 该算法通过二分查找值域,逐步缩小第 k 小元素可能存在的范围。

  • 在每次迭代中,计算 count(mid)(小于等于 mid 的元素个数)与 k 比较,可以确定第 k 小元素位于左半区间还是右半区间。

  • 最终,left 会收敛到矩阵中的一个实际元素,且满足是第 k 小元素(详见示例验证)。

时间复杂度分析
  • 确定 min_val 和 max_val 需要O(n)时间。

  • 二分查找的迭代次数为O(logD),其中D=max_val−min_val。

  • 在每次迭代中,统计 count(mid) 需要对每一行进行一次二分查找(每行时间复杂度O(logn)),因此每次迭代的时间复杂度为O(nlogn)

  • 总时间复杂度为O(nlognlogD)

示例说明

考虑一个 2×2 矩阵:

\begin{bmatrix} 1 & 3\\ 2& 5 \end{bmatrix}

元素集合为 {1,2,3,5},排序后为 [1,2,3,5]。

  • 求第 k=2 小元素:

    • min_val = min(1, 2) = 1max_val = max(3, 5) = 5left = 1right = 5

    • 第一次迭代:mid = (1 + 5) // 2 = 3count(<=3)

      • 第一行:元素 [1,3],1≤3,3≤3,个数为 2。

      • 第二行:元素 [2,5],2≤3,5>3,个数为 1。

      • count = 2 + 1 = 3 >= 2,设置 right = 3

    • 第二次迭代:left = 1right = 3mid = (1 + 3) // 2 = 2count(<=2)

      • 第一行:1≤2,3>2,个数为 1。

      • 第二行:2≤2,5>2,个数为 1。

      • count = 1 + 1 = 2 >= 2,设置 right = 2

    • 第三次迭代:left = 1right = 2mid = (1 + 2) // 2 = 1count(<=1)

      • 第一行:1≤1,3>1,个数为 1。

      • 第二行:2>1,个数为 0。

      • count = 1 < 2,设置 left = 1 + 1 = 2

    • 循环结束,left = 2,返回 2(正确,第 2 小元素是 2)。

代码实现
def kthSmallest(matrix, k):n = len(matrix)# 初始化二分查找的边界left = matrix[0][0]              # 最小值:矩阵左上角right = matrix[n-1][n-1]         # 最大值:矩阵右下角# 二分查找while left < right:mid = (left + right) // 2count = 0                    # 统计小于等于mid的元素个数col = n - 1                 # 从每行的末尾开始检查# 遍历每一行for i in range(n):# 在当前行中,从右向左找到第一个小于等于mid的元素while col >= 0 and matrix[i][col] > mid:col -= 1count += (col + 1)       # 该行中小于等于mid的元素个数# 调整二分查找边界if count >= k:right = midelse:left = mid + 1return left# 示例测试
if __name__ == "__main__":matrix1 = [[1, 3], [2, 5]]print(kthSmallest(matrix1, 2))  # 输出: 2matrix2 = [[1, 5, 9], [10, 11, 13], [12, 13, 15]]print(kthSmallest(matrix2, 4))  # 输出: 10matrix3 = [[-5]]print(kthSmallest(matrix3, 1))  # 输出: -5

暴力解

忽略行递增条件,直接全排序:

def kth_smallest(matrix, k):n = len(matrix)# 提取所有元素到一维列表flat_list = []for i in range(n):for j in range(n):flat_list.append(matrix[i][j])# 排序列表flat_list.sort()# 返回第k小的元素(k从1开始,索引为k-1)return flat_list[k-1]

http://www.hkcw.cn/article/DkCOJHmEUl.shtml

相关文章

【PostgreSQL 02】PostgreSQL数据类型革命:JSON、数组与地理信息让你的应用飞起来

PostgreSQL数据类型革命&#xff1a;JSON、数组与地理信息让你的应用飞起来 关键词 PostgreSQL高级数据类型, JSONB, 数组类型, PostGIS, 地理信息系统, NoSQL, 文档数据库, 空间数据, 数据库设计, PostgreSQL扩展 摘要 PostgreSQL的高级数据类型是其区别于传统关系数据库的核心…

[Windows] 剪映 视频编辑处理

附链接&#xff1a;夸克网盘分享&#xff08;点击蓝色字体自行保存下载&#xff09;

NW994NX734美光固态闪存NX737NX740

NW994NX734美光固态闪存NX737NX740 在数字化浪潮汹涌澎湃的今天&#xff0c;数据存储技术如同一座坚实的基石&#xff0c;支撑着科技世界的大厦。美光固态闪存以其卓越的性能和创新的技术&#xff0c;在存储领域占据着重要的地位。本文将深入剖析NW994、NX734、NX737以及NX740…

C# 类和继承(使用基类的引用)

使用基类的引用 派生类的实例由基类的实例和派生类新增的成员组成。派生类的引用指向整个类对象&#xff0c;包括 基类部分。 如果有一个派生类对象的引用&#xff0c;就可以获取该对象基类部分的引用&#xff08;使用类型转换运算符把 该引用转换为基类类型&#xff09;。类…

VMvare 创建虚拟机 安装CentOS7,配置静态IP地址

创建虚拟机 安装CentOS7 设置网络模式 设置静态ip vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network

python:PyMOL 能处理 *.pdb 文件吗?

PyMOL 完全可以打开并处理 PDB&#xff08;Protein Data Bank&#xff09;文件&#xff0c;这是 PyMOL 最主要的功能之一。PDB 格式是结构生物学领域的标准文件格式&#xff0c;专门用于存储生物大分子&#xff08;如蛋白质、核酸&#xff09;的三维结构数据。 在 PyMOL 中打开…

【数据治理】要点整理-信息技术数据质量评价指标-GB/T36344-2018

导读&#xff1a;指标为数据质量评估提供了一套系统化、标准化的框架&#xff0c;涵盖规范性、完整性、准确性、一致性、时效性、可访问性六大核心指标&#xff0c;助力组织提升数据处理效率、支持决策制定及业务流程优化&#xff0c;确保数据在数据生存周期各阶段的质量可控。…

【Redis】hash 类型

hash 一. hash 类型介绍二. hash 命令hset、hgethexists、hdelhkeys、hvals、hgetallhmset、hmgethlen、hstrlen、hsetnxhincrby、hincrbyfloat 三. hash 命令小结四. hash 内部编码方式五. hash 的应用场景缓存功能缓存方式对比 一. hash 类型介绍 哈希表在日常开发中&#x…

ubuntu/windows系统下如何让.desktop/.exe文件 在开机的时候自动运行

目录 1&#xff0c;​​让 .desktop 文件在 Ubuntu 开机时自动启动​ 1.1 创建 autostart 目录&#xff08;如果不存在&#xff09;​ ​ 1.2 将 .desktop 文件复制到 autostart 目录​ ​ 1.3 确保 .desktop 文件有可执行权限​ 2,windows 2.1 打开「启动」文件夹​…

1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集

引言 在嵌入式系统中&#xff0c;通信总线是连接 CPU 与外设的桥梁。从 I2C、SPI 到 UART&#xff0c;每种总线都有其独特的应用场景。而本文要介绍的1-Wire 一线式总线&#xff0c;以其极简的硬件设计和独特的通信协议&#xff0c;在温度采集、身份识别等领域大放异彩。本文将…

有机黑鸡蛋与普通鸡蛋:差异剖析与选购指南

在我们的日常饮食结构里&#xff0c;鸡蛋始终占据着不可或缺的位置&#xff0c;是人们获取营养的重要来源。如今&#xff0c;市场上鸡蛋种类丰富&#xff0c;除了常见的普通鸡蛋&#xff0c;有机黑鸡蛋也逐渐崭露头角&#xff0c;其价格通常略高于普通鸡蛋。这两者究竟存在哪些…

Fastapi 学习使用

Fastapi 学习使用 Fastapi 可以用来快速搭建 Web 应用来进行接口的搭建。 参考文章&#xff1a;https://blog.csdn.net/liudadaxuexi/article/details/141062582 参考文章&#xff1a;https://blog.csdn.net/jcgeneral/article/details/146505880 参考文章&#xff1a;http…

数字化转型进阶:精读41页华为数字化转型实践【附全文阅读】

该文档聚焦华为数字化转型实践&#xff0c;核心内容如下&#xff1a; 转型本质与目标&#xff1a;数字化转型是通过数字技术穿透业务&#xff0c;实现物理世界与数字世界的融合&#xff0c;目标是支撑主业成功、提升体验与效率、探索模式创新。华为以 “平台 服务” 为核心&am…

共享内存-systemV

01. 共享内存简述 共享内存是一个允许多个进程直接访问同一块物理内存区域的进程通信工具&#xff0c;因其本身不涉及用户态与核心态之间转换&#xff0c;故效率最佳。为了使用一个共享内存段&#xff0c;一般需要以下几个步骤&#xff1a; 调用shmget()创建一个新共享内存段…

大语言模型值ollama使用(1)

ollama为本地调用大语言模型提供了便捷的方式。下面列举如何在windows系统中快捷调用ollama。 winR打开运行框&#xff0c;输入cmd 1、输入ollama list 显示已下载模型 2、输入ollama pull llama3 下载llama3模型 3、 输入 ollama run llama3 运行模型 4、其他 ollama li…

【基础算法】高精度(加、减、乘、除)

文章目录 什么是高精度1. 高精度加法解题思路代码实现 2. 高精度减法解题思路代码实现 3. 高精度乘法解题思路代码实现 4. 高精度除法 (高精度 / 低精度)解题思路代码实现 什么是高精度 我们平时使用加减乘除的时候都是直接使用 - * / 这些符号&#xff0c;前提是进行运算的数…

uni-data-picker级联选择器、fastadmin后端api

记录一个部门及部门人员选择的功能&#xff0c;效果如下&#xff1a; 组件用到了uni-ui的级联选择uni-data-picker 开发文档&#xff1a;uni-app官网 组件要求的数据格式如下&#xff1a; 后端使用的是fastadmin&#xff0c;需要用到fastadmin自带的tree类生成部门树 &#x…

MonitorSDK_性能监控(从Web Vital性能指标、PerformanceObserver API和具体代码实现)

性能监控 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量化和优化网页在实际用户终端上的性能体验。Web Vitals 强调“以用户为中心”的度量&#xff0c;而…

Kubernetes架构与核心概念深度解析:Pod、Service与RBAC的奥秘

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言&#xff1a;云原生时代的操作系统 在云原生技术浪潮中&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;已成为容器编排领域的"分布式操…

enumiax:IAX 协议用户名枚举器!全参数详细教程!Kali Linux教程!

简介 enumIAX 是一个 Inter Asterisk Exchange 协议用户名暴力枚举器。enumIAX 可以以两种不同的模式运行&#xff1b;顺序用户名猜测或字典攻击。 enumIAX 可以以两种不同的模式运行&#xff1a;顺序用户名猜测或字典攻击。 顺序用户名猜测 在顺序用户名猜测模式下&#xf…