leetcode二维数组高频面试题详解:48.原地旋转矩阵 + 240.杨氏矩阵查找算法深度剖析
你好我是fengxin_rou这是我的个人主页fengxin_rou的主页❄️欢迎查看我的专栏我的专栏《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》目录一、前言二、LeetCode48 旋转图像n×n 方阵原地顺时针旋转 90° 详解2.1 题目需求与核心难点2.1.1 原题题意回顾2.1.2 解题核心难点2.2 数学坐标变换原理推导2.2.1 循环边界推导关键易错点2.3 Java 完整可运行代码实现2.4 第二种解题思路两次翻转上下翻转 主对角线翻转拓展方案2.5 踩坑总结与面试易错点2.6 拓展延伸逆时针旋转 90° 变形题思路三、LeetCode240 搜索二维矩阵 II杨氏矩阵高效查找算法详解3.1 题目特性与题意分析3.1.1 矩阵两大关键有序属性3.1.2 最优算法切入点选左下角 / 右上角作为起始坐标3.2 贪心查找算法原理拆解3.3 Java 完整 AC 代码实现3.4 其他解法拓展逐行二分查找进阶对比3.5 高频踩坑点汇总3.6 面试拓展提问四、两道题目面试横向对比总结五、算法学习优化拓展与资源推荐六、结语一、前言在 Java 后端、算法面试当中二维矩阵操作是笔试与现场面试高频考点其中 LeetCode 第 48 题《旋转图像原地顺时针 90° 旋转 n 阶方阵》、LeetCode 第 240 题《搜索二维矩阵 II杨氏矩阵查找》是大厂算法题库经典标杆题目。两道题目分别考察矩阵坐标变换数学规律与有序数组的二分思想 贪心查找也是数组进阶学习绕不开的核心例题。本文将从原理推导、解题思路、代码落地、易错踩坑、多种优化方案五个维度完整拆解两道经典算法题全部代码基于 Java 实现可直接粘贴至 LeetCode 在线 OJ 运行通过。二、LeetCode48 旋转图像n×n 方阵原地顺时针旋转 90° 详解2.1 题目需求与核心难点2.1.1 原题题意回顾给定大小为n×n的二维整数矩阵要求原地顺时针旋转 90 度不允许开辟额外同等大小数组存储结果只能在原输入矩阵上直接修改元素空间复杂度约束为\(O(1)\)。 示例输入 3 阶方阵1 2 3 4 5 6 7 8 9顺时针旋转 90° 后输出7 4 1 8 5 2 9 6 32.1.2 解题核心难点常规思路新建数组按映射关系赋值时间\(O(n^2)\)、空间\(O(n^2)\)违反原地修改的题目硬性限制 难点 1推导顺时针 90° 旋转时四个对应位置的坐标数学变换公式 难点 2确定双重循环的遍历边界避免同一个元素被多次轮换、重复修改导致数据错乱 难点 3区分奇数阶、偶数阶方阵中心元素处理逻辑奇数阶矩阵正中心元素旋转后位置不变无需参与交换。2.2 数学坐标变换原理推导设原矩阵下标[i,j]行 i列 j数组下标从 0 开始矩阵边长 n顺时针旋转 90° 后元素会轮换到四个点位2.2.1 循环边界推导关键易错点外层循环行i只需要遍历上半部分行i n/2下半行会被上层元素轮换覆盖重复遍历会二次修改内层循环列j奇数阶矩阵中间列不需要遍历因此j (n1)/2兼容奇偶两种阶数n 为偶数\(n4(41)/22\)j2前两列遍历n 为奇数\(n3(31)/22\)j2前两列遍历中间列 j2 跳过中心元素不动。2.3 Java 完整可运行代码实现class Solution { public void rotate(int[][] matrix) { // 获取方阵阶数n int n matrix.length; // 外层行边界 i n/2 for(int i 0; i n / 2; i){ // 内层列边界 j (n1)/2兼容奇偶阶矩阵 for(int j 0; j (n1) / 2; j){ // 暂存左上角起始元素 int temp matrix[i][j]; // 四个点位循环赋值轮换 matrix[i][j] matrix[n-1-j][i]; matrix[n-1-j][i] matrix[n-1-i][n-1-j]; matrix[n-1-i][n-1-j] matrix[j][n-1-i]; matrix[j][n-1-i] temp; } } } }代码说明时间复杂度\(O(n^2)\)每个元素仅被访问 1 次空间复杂度\(O(1)\)仅使用单个临时变量 temp完全满足原地修改要求LeetCode 提交可全用例 AC。2.4 第二种解题思路两次翻转上下翻转 主对角线翻转拓展方案除四点轮换法外业界通用另一种原地旋转思路先上下翻转整行再沿主对角线翻转同样满足(O(1))原地要求附上拓展代码class SolutionRotate2 { public void rotate(int[][] matrix) { int n matrix.length; // 第一步上下行翻转 for(int i 0; i n/2; i){ int[] temp matrix[i]; matrix[i] matrix[n-1-i]; matrix[n-1-i] temp; } // 第二步主对角线(ij)两侧元素互换 for(int i 0; i n; i){ for(int j i1; j n; j){ int temp matrix[i][j]; matrix[i][j] matrix[j][i]; matrix[j][i] temp; } } } }2.5 踩坑总结与面试易错点循环边界写错若内层 j 写成jn/2奇数矩阵中间列元素无法参与轮换结果错误赋值顺序颠倒四个点位赋值必须倒序先存起点值从后往前覆盖顺序错误直接数据错乱误区新手容易直接开辟新数组存储结果虽然逻辑简单但违背题目原地核心约束面试直接扣分2.6 拓展延伸逆时针旋转 90° 变形题思路逆时针 90° 可修改坐标映射公式或调整翻转顺序左右翻转 对角线翻转面试常由原题变形提问。三、LeetCode240 搜索二维矩阵 II杨氏矩阵高效查找算法详解3.1 题目特性与题意分析3.1.1 矩阵两大关键有序属性每行元素从左到右严格升序每列元素从上到下严格升序 该类有序矩阵也被称作杨氏矩阵Young tableau要求在\(O(mn)\)最优时间复杂度内查找目标 target禁止暴力全遍历\(O(mn)\)。 样例矩阵1 4 7 11 15 2 5 8 12 19 3 6 9 16 22 10 13 14 17 24查找 target5 返回 true查找 target20 返回 false。 【此处插入杨氏矩阵查找起点左下角标注示意图箭头标注移动规则】3.1.2 最优算法切入点选左下角 / 右上角作为起始坐标左下角特点本行最大、本列最小当前值 target本列全部小于 target列右移j当前值 target本行全部大于 target行上移i--同理右上角本行最小、本列最大也可作为起点移动逻辑反向。3.2 贪心查找算法原理拆解起始坐标i m-1最后一行下标j0首列下标循环终止条件行越上界 (i0) 或列越右界 (j 总列数)matrix[i][j] target当前整列所有元素≤当前值目标不可能在本列列 1matrix[i][j] target当前整行所有元素≥当前值目标不可能在本行行 - 1相等直接返回 true循环结束未命中返回 false。3.3 Java 完整 AC 代码实现class Solution { public boolean searchMatrix(int[][] matrix, int target) { // 边界特判空矩阵直接返回false if(matrix null || matrix.length 0 || matrix[0].length 0){ return false; } // 起点左下角坐标最后一行、第0列 int i matrix.length - 1; int j 0; // 循环坐标不出矩阵边界 while(i 0 j matrix[0].length){ if(matrix[i][j] target){ // 偏小→右移一列 j; }else if(matrix[i][j] target){ // 偏大→上移一行 i--; }else{ // 找到目标值 return true; } } // 遍历结束未找到 return false; } }复杂度时间\(O(mn)\)行、列最多各走一次空间\(O(1)\)最优解LeetCode 全部测试用例通过。3.4 其他解法拓展逐行二分查找进阶对比由于每行有序可对每行单独二分查找时间复杂度\(O(m*logn)\)数据量极大时效率低于贪心\(O(mn)\)附上二分版本代码class SolutionSearchBinary { public boolean searchMatrix(int[][] matrix, int target) { for(int[] row : matrix){ // 单行二分 int left 0, right row.length -1; while(left right){ int mid left (right - left)/2; if(row[mid] target) return true; else if(row[mid] target) left mid 1; else right mid -1; } } return false; } }3.5 高频踩坑点汇总空数组边界遗漏未判断matrix[0].length0输入空行数组会触发数组下标越界异常起始坐标选错从左上角 (0,0) 开始无法贪心移动只能暴力遍历算法直接退化移动方向搞反小于 target 时错误行下移大于 target 错误列左移逻辑完全失效。3.6 面试拓展提问面试官延伸杨氏矩阵查找第 K 小元素基于本题思路衍生堆解法是进阶面试考点。四、两道题目面试横向对比总结题目核心思想最优时空复杂度考察侧重点48. 旋转矩阵坐标数学变换 / 矩阵翻转\(O(n^2)、O(1)\)二维数组下标规律、原地操作思维240. 杨氏查找贪心 有序特性\(O(mn)、O(1)\)有序数据的贪心策略、边界处理【此处插入两张题目考点思维导图汇总图片占位】五、算法学习优化拓展与资源推荐刷题平台官方文档LeetCode 官方中文题库文档https://leetcode.cn/problemset/all/可在线调试两道原题查看官方题解与多语言实现方案算法开源仓库Java 算法刷题开源库Githubhttps://github.com/doocs/leetcode收录全 LeetCode 题解、多思路优化版本适合日常查漏补缺。学习建议先手动在草稿纸上模拟坐标变换与查找移动步骤再落地编码切忌直接复制代码吃透下标规律才能应对各类矩阵变形面试题。六、结语矩阵类算法是数组从一维进阶二维的关键分水岭两道经典题分别代表坐标变换与有序贪心两大算法方向也是校招、社招后端算法笔试常客。吃透本文推导逻辑与代码后续遇到矩阵转置、矩阵螺旋遍历、杨氏矩阵变种题均可快速举一反三。如果本篇内容对你的算法学习有帮助欢迎点赞 收藏后续持续更新 LeetCode 高频数组、链表、二叉树面试真题详解