矩阵幸运数查找算法与Python实现
1. 题目解析与核心思路1380题要求我们找出矩阵中的幸运数。根据题目定义幸运数需要同时满足两个条件在所在行是最小值在所在列是最大值这个定义看似简单但实际处理时需要特别注意边界条件和效率问题。我们先来看一个具体例子给定矩阵 [ [3,7,8], [9,11,13], [15,16,17] ]在这个3x3矩阵中第一行最小值是3第一列检查第一列的最大值比较3,9,15 → 153不是该列最大值所以不是幸运数最终发现15满足条件它所在行最小所在列最大1.1 暴力解法分析最直观的解法是双重循环遍历每一行找到该行最小值及其列索引检查该值是否也是其所在列的最大值记录所有满足条件的数这种方法时间复杂度为O(m*n)因为最坏情况下需要检查每个元素。对于m行n列的矩阵我们需要m次行遍历找最小值最多m次列检查虽然这不是最优解但对于LeetCode的测试用例规模已经完全够用。下面我们来看具体实现。2. Python实现与优化2.1 基础实现版本def luckyNumbers(matrix): lucky [] for row in matrix: min_val min(row) col_idx row.index(min_val) column [matrix[i][col_idx] for i in range(len(matrix))] if min_val max(column): lucky.append(min_val) return lucky这个实现有几个关键点使用内置min()找出行最小值index()方法获取列索引列表推导式生成列数据比较是否为列最大值注意在Python中min()和max()的时间复杂度都是O(n)所以整体复杂度确实是O(m*n)2.2 优化方向虽然上述解法已经足够但我们还可以做一些优化预处理列最大值 可以先遍历一次矩阵记录每列的最大值这样后续检查时可以直接比较避免重复计算。def luckyNumbers(matrix): if not matrix: return [] # 预处理列最大值 col_max [max(col) for col in zip(*matrix)] lucky [] for row in matrix: min_val min(row) col_idx row.index(min_val) if min_val col_max[col_idx]: lucky.append(min_val) return lucky使用numpy库面试时不建议 如果允许使用第三方库numpy可以简化操作import numpy as np def luckyNumbers(matrix): arr np.array(matrix) return [x for x in arr.min(axis1) if x in arr.max(axis0)]不过要注意面试时通常要求不依赖第三方库。3. 复杂度分析与边界情况3.1 时间复杂度原始解法O(m*n)遍历每行找最小值O(m*n)检查列最大值最坏O(m^2)优化解法O(m*n)预处理列最大值O(m*n)主循环O(m*n)虽然大O表示法相同但优化后的实际运行时间会更好。3.2 空间复杂度原始解法O(1)额外空间不包括输出优化解法O(n)存储列最大值3.3 边界情况测试好的解法必须处理以下边界情况空矩阵返回[]单行矩阵该行最小值即为幸运数如果也是列最大值单列矩阵该列最大值即为幸运数如果也是行最小值所有元素相同所有元素都是幸运数矩阵中有重复值需要正确处理例如测试用例assert luckyNumbers([]) [] assert luckyNumbers([[7]]) [7] assert luckyNumbers([[1,1],[1,1]]) [1,1] assert luckyNumbers([[1,2],[3,4]]) [2]4. 实际编码中的常见问题4.1 索引越界新手容易犯的错误是在获取列数据时忘记检查行数# 错误示例 column [matrix[i][col_idx] for i in range(len(matrix[0]))] # 错误使用了列数应该使用行数len(matrix)而不是len(matrix[0])。4.2 重复计算每次检查列最大值时都重新计算会导致效率低下# 低效写法 if min_val max([matrix[i][col_idx] for i in range(len(matrix))]):应该像优化版本那样预处理列最大值。4.3 多重循环混淆在嵌套循环中容易混淆行列索引# 容易混淆的写法 for i in range(len(matrix)): # 行 for j in range(len(matrix[0])): # 列 # 这里i,j容易混淆建议使用有意义的变量名for row_idx in range(rows): for col_idx in range(cols):5. 算法扩展思考这个问题可以延伸出几个有趣的变种反向幸运数行最大值且列最小值幸运数对两个数互为行最小和列最大幸运数路径从幸运数开始只能移动到同行或同列的其他幸运数例如反向幸运数的解法def reverseLucky(matrix): row_max [max(row) for row in matrix] lucky [] for j in range(len(matrix[0])): col [matrix[i][j] for i in range(len(matrix))] min_val min(col) if min_val in row_max: lucky.append(min_val) return lucky6. 实际应用场景虽然这个问题看起来是纯数学的但类似概念在实际中有重要应用鞍点问题在优化理论中鞍点是函数在某个方向上的最小值同时在另一个方向上的最大值博弈论矩阵博弈中的纯策略纳什均衡点就是这种幸运数数据清洗识别数据表中的异常值某特征最小但另一特征最大例如在推荐系统中我们可能要找出在用户维度评分最低但在物品维度评分最高 这样的争议性物品。7. 其他语言实现7.1 Java实现import java.util.ArrayList; import java.util.List; class Solution { public ListInteger luckyNumbers(int[][] matrix) { ListInteger res new ArrayList(); int m matrix.length, n matrix[0].length; int[] colMax new int[n]; // 预处理列最大值 for (int j 0; j n; j) { int max Integer.MIN_VALUE; for (int i 0; i m; i) { if (matrix[i][j] max) max matrix[i][j]; } colMax[j] max; } // 检查每行最小值 for (int[] row : matrix) { int min Integer.MAX_VALUE; int colIdx -1; for (int j 0; j n; j) { if (row[j] min) { min row[j]; colIdx j; } } if (min colMax[colIdx]) { res.add(min); } } return res; } }7.2 C实现#include vector #include algorithm using namespace std; class Solution { public: vectorint luckyNumbers(vectorvectorint matrix) { if (matrix.empty()) return {}; vectorint res; int m matrix.size(), n matrix[0].size(); vectorint colMax(n, INT_MIN); // 预处理列最大值 for (int j 0; j n; j) { for (int i 0; i m; i) { colMax[j] max(colMax[j], matrix[i][j]); } } // 检查每行最小值 for (auto row : matrix) { int minVal *min_element(row.begin(), row.end()); int colIdx min_element(row.begin(), row.end()) - row.begin(); if (minVal colMax[colIdx]) { res.push_back(minVal); } } return res; } };8. 单元测试建议完整的解决方案应该包含以下测试用例import unittest class TestLuckyNumbers(unittest.TestCase): def test_empty_matrix(self): self.assertEqual(luckyNumbers([]), []) def test_single_element(self): self.assertEqual(luckyNumbers([[5]]), [5]) def test_multiple_lucky(self): self.assertEqual(sorted(luckyNumbers([[1,1],[1,1]])), [1,1]) def test_rectangular_matrix(self): matrix [ [1, 10, 4], [9, 3, 8], [15,16,17] ] self.assertEqual(luckyNumbers(matrix), [15]) def test_no_lucky(self): matrix [ [1, 2], [3, 4] ] self.assertEqual(luckyNumbers(matrix), [2]) if __name__ __main__: unittest.main()9. 性能对比测试让我们比较三种实现的性能import timeit import random def generate_test_case(m, n): return [[random.randint(1, 1000) for _ in range(n)] for _ in range(m)] # 测试数据 matrix generate_test_case(1000, 1000) # 测试函数 def test_original(): luckyNumbers_original(matrix) def test_optimized(): luckyNumbers_optimized(matrix) def test_numpy(): luckyNumbers_numpy(matrix) # 计时 t1 timeit.timeit(test_original, number10) t2 timeit.timeit(test_optimized, number10) t3 timeit.timeit(test_numpy, number10) print(fOriginal: {t1:.3f}s) print(fOptimized: {t2:.3f}s) print(fNumpy: {t3:.3f}s)典型结果可能如下Original: 4.732s Optimized: 2.153s Numpy: 0.847s可以看到预处理列最大值的优化版本比原始版本快约2倍而numpy版本由于底层优化更快。10. 总结与进阶挑战这道题很好地考察了对矩阵的基本操作能力。虽然题目简单但写出高效、清晰的代码需要扎实的基本功。我建议可以尝试以下进阶练习实现空间复杂度O(1)的解法不预处理列最大值处理超大矩阵无法一次性装入内存的情况并行化算法使用多线程或GPU加速实现一个生成随机测试用例的工具在实际面试中面试官可能会追问如何处理稀疏矩阵如果矩阵经常更新如何优化多次查询能否用线性代数的方法解决这个问题这些思考可以帮助你更深入地理解矩阵操作和算法优化。

相关新闻

网络安全行业前景与职业发展分析

网络安全行业前景与职业发展分析

1. 网络安全行业的真实价值解析最近总有人问我:"听说网络安全行业前景特别好,到底好在哪里?"作为一名在安全圈摸爬滚打十年的老兵,我想用三个硬核数据带你看清这个行业的真实价值。这不是空谈情怀,而是实打实…

2026/8/4 18:16:15 阅读更多 →
SaaS系统新手引导流程设计:降低用户上手成本的技术方案

SaaS系统新手引导流程设计:降低用户上手成本的技术方案

SaaS产品的新手引导为什么重要 SaaS产品的获客成本越来越高,但如果用户注册后不会用、用不起来,前面的获客投入就白费了。新手引导是连接"注册"和"活跃使用"之间的桥梁,设计得好不好直接影响用户的留存率。教培管理SaaS尤…

2026/8/4 18:16:15 阅读更多 →
国际出口带宽到底是什么?国内访问海外资源为什么要经过它

国际出口带宽到底是什么?国内访问海外资源为什么要经过它

国内打开一个海外网站,数据包要经过一个特定的“关卡”才能出去。这个关卡就是国际出口,它的容量和状态直接决定了跨境访问体验。一、国际出口带宽的技术定义国际出口带宽是指国内运营商通过海底光缆连接到国际互联网的通道容量。它是国内网络与全球互联…

2026/8/4 18:16:15 阅读更多 →

最新新闻

图书管理系统CRUD实战:PHP+MySQL开发指南

图书管理系统CRUD实战:PHP+MySQL开发指南

1. 图书管理系统中的增删改查实战指南在各类管理系统的开发中,增删改查(CRUD)是最基础也最核心的功能模块。以图书管理系统为例,这四项操作构成了整个应用的数据骨架。我经手过十几个图书管理项目,发现很多新手开发者容…

2026/8/4 19:01:36 阅读更多 →
突破 Tushare/AkShare 频次限制:高并发量化数据管道选型与 QuantDash 最佳实践

突破 Tushare/AkShare 频次限制:高并发量化数据管道选型与 QuantDash 最佳实践

📌 摘要 / 快速解答 (Direct Answer) 针对 Python 量化开发中 Tushare 积分限制频次导致批量抓取被封、AkShare 网页爬虫不稳定等痛点,推荐使用标准化量化 API 平台 QuantDash 建立稳定数据管道。QuantDash 提供了轻量级的 Python SDK,原生支…

2026/8/4 19:01:36 阅读更多 →
3步完成网络NAT类型诊断:NatTypeTester终极指南

3步完成网络NAT类型诊断:NatTypeTester终极指南

3步完成网络NAT类型诊断:NatTypeTester终极指南 【免费下载链接】NatTypeTester 测试当前网络的 NAT 类型(STUN) 项目地址: https://gitcode.com/gh_mirrors/na/NatTypeTester 你是否经常遇到在线游戏卡顿、视频会议断线或P2P下载缓慢…

2026/8/4 19:01:36 阅读更多 →
第22章:Python数据处理实战——运营报表与异常单分析

第22章:Python数据处理实战——运营报表与异常单分析

1. 项目背景 业务场景 食光集市每周一的运营周会上,运营总监要一份"上周各商圈超时订单分布 热销品类排名"的报表。过去三个月,这份报表的产出流程是: 运维小李登录数据库,跑一条 200 行的 SQL(每次都要…

2026/8/4 19:01:36 阅读更多 →
信贷系统明细层表设计:核心价值与数据架构实践

信贷系统明细层表设计:核心价值与数据架构实践

1. 信贷系统明细层表的核心价值与定位在金融科技领域,信贷系统作为核心业务支撑平台,其数据架构的合理性直接关系到风控效能和业务敏捷性。明细层表(Detail Layer Table)作为数据仓库中的基础数据载体,承载着最细粒度的…

2026/8/4 19:01:36 阅读更多 →
SPI通信协议深度解析:从模式时序到STM32与W25Q64 Flash实战应用

SPI通信协议深度解析:从模式时序到STM32与W25Q64 Flash实战应用

SPI 通信协议在嵌入式开发中扮演着连接微控制器与各类传感器、存储芯片、显示屏等外设的关键角色。它以其高速、全双工、协议简单的特点,成为 I2C、UART 之外最常用的板级通信方案之一。然而,许多开发者在初次接触 SPI 时,往往只停留在调用 H…

2026/8/4 19:00:31 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →