手撕hot100之矩阵!看完这篇就AC~(下)
2026/5/7 1:22:31 网站建设 项目流程

目录

1 题目

2 代码实现

c++

js

思考

题解

3 题目

4 代码实现

c++

js

思考

题解

核心规则

5 小结

一、LeetCode 48 旋转图像(顺时针 90°)

通用思路模板(必背)

C++ 标准模板

JS 标准模板

二、LeetCode 240 搜索二维矩阵 II

通用思路模板(必背)

C++ 标准模板

JS 标准模板

旋转图像

搜索矩阵


1 题目

48. 旋转图像

给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

2 代码实现

c++

class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); for (int i = 0 ; i < n / 2 ; i++){ swap(matrix[i],matrix[n - i - 1 ]); } for (int i = 0 ; i < n ; i++ ){ for (int j = i + 1 ; j < n ; ++j){ swap(matrix[i][j] , matrix[j][i]); } } } };

js

/** * @param {number[][]} matrix * @return {void} Do not return anything, modify matrix in-place instead. */ var rotate = function(matrix) { const n = matrix.length ; for (let i = 0 ; i < n / 2 ; i ++){ [matrix[i] , matrix[n - i - 1 ]] = [matrix[n - i - 1 ], matrix[i]]; }; for (let i = 0 ; i < n ; i++){ for (let j = 1 + i ; j < n ; j++ ){ [matrix[i][j] , matrix[j][i]] = [matrix[j][i] , matrix[i][j]]; } } };

思考

原地修改,只能找一个规律,每个格子都和谁换座位。啊,下面的题解其实是用原地旋转做的。

题解

  • 第一步:将矩阵上下翻转(以水平中线为轴翻转)
  • 第二步:将矩阵沿主对角线翻转(左上→右下对角线)
class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); // 第一步:上下翻转 for (int i = 0; i < n / 2; ++i) { swap(matrix[i], matrix[n - 1 - i]); } // 第二步:沿主对角线翻转 (i,j) ↔ (j,i) for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { swap(matrix[i][j], matrix[j][i]); } } } };

3 题目

240. 搜索二维矩阵 II

编写一个高效的算法来搜索mxn矩阵matrix中的一个目标值target。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5输出:true

示例 2:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -109 <= matrix[i][j] <= 109
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109

4 代码实现

c++

class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.empty() || matrix[0].empty()) return false ; int m = matrix.size() ; int n = matrix[0].size() ; int row = 0 ; int col = n - 1 ; while (row < m && col >= 0 ){ if (matrix[row][col] == target){ return true ; } else if (matrix[row][col] > target){ col -- ; }else{ row ++ ; } } return false ; } };

js

/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var searchMatrix = function(matrix, target) { if (matrix.length === 0 || matrix[0].length === 0 ) return false ; const m = matrix.length ; //行 const n = matrix[0].length ;//列 let row = 0 ; let col = n -1 ; while (col < n && row < m ){ if (matrix[row][col] === target){ return true ; }else if (matrix[row][col] > target){ col -- ; }else { row ++ ; } } return false ; };

思考

仅仅是每个矩阵里面相对有序,但是不能简单按照行或者列先定下来,不知道怎么做...

题解

选右上角作为起点,利用矩阵有序特性,每一步直接排除一整行 或 一整列,时间复杂度直接降到O(m + n)

核心规则

起点固定选:右上角元素matrix[row][col]

  1. 当前值 == 目标值→ 找到,返回true
  2. 当前值 > 目标值→ 目标一定在左边列向左移动(排除当前列)
  3. 当前值 < 目标值→ 目标一定在下边行向下移动(排除当前行)
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { // 空矩阵直接返回 if (matrix.empty() || matrix[0].empty()) return false; int m = matrix.size(); // 行数 int n = matrix[0].size(); // 列数 // 起点:右上角 (第0行,最后一列) int row = 0; int col = n - 1; // 不越界就一直查找 while (row < m && col >= 0) { if (matrix[row][col] == target) { return true; // 找到目标 } else if (matrix[row][col] > target) { col--; // 太大,往左走(排除当前列) } else { row++; // 太小,往下走(排除当前行) } } return false; // 遍历完没找到 } };

5 小结

代码很直观,思路很简单。

一、LeetCode 48 旋转图像(顺时针 90°)

通用思路模板(必背)

原地顺时针旋转 90° = 上下翻转 + 主对角线翻转

  1. 上下翻转:第 i 行 ↔ 第 n-1-i 行
  2. 对角线翻转:(i,j) ↔ (j,i)
  3. 空间复杂度 O (1),时间 O (n²)

C++ 标准模板
class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); // 1. 上下翻转 for (int i = 0; i < n / 2; i++) { swap(matrix[i], matrix[n - 1 - i]); } // 2. 主对角线翻转 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } } } };
JS 标准模板
var rotate = function(matrix) { const n = matrix.length; // 1. 上下翻转 for (let i = 0; i < n / 2; i++) { [matrix[i], matrix[n - 1 - i]] = [matrix[n - 1 - i], matrix[i]]; } // 2. 对角线翻转 for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]]; } } };

二、LeetCode 240 搜索二维矩阵 II

通用思路模板(必背)

有序矩阵查找 = 右上角起点贪心搜索

  1. 起点:右上角 (0, n-1)
  2. 规则:
    • 比 target 大 →向左走(排除整列)
    • 比 target 小 →向下走(排除整行)
    • 相等 → 找到
  3. 时间 O (m+n),空间 O (1)

C++ 标准模板
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.empty() || matrix[0].empty()) return false; int m = matrix.size(), n = matrix[0].size(); int row = 0, col = n - 1; while (row < m && col >= 0) { if (matrix[row][col] == target) return true; else if (matrix[row][col] > target) col--; else row++; } return false; } };
JS 标准模板
var searchMatrix = function(matrix, target) { if (!matrix.length || !matrix[0].length) return false; const m = matrix.length, n = matrix[0].length; let row = 0, col = n - 1; while (row < m && col >= 0) { if (matrix[row][col] === target) return true; else if (matrix[row][col] > target) col--; else row++; } return false; };

旋转图像

先上下翻转,再对角线翻转 = 顺时针 90°

搜索矩阵

右上角起步,大了左走,小了下走一步排除一行 / 一列,效率最高

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询