目录
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].length1 <= 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.lengthn == matrix[i].length1 <= 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]
- 当前值 == 目标值→ 找到,返回
true - 当前值 > 目标值→ 目标一定在左边,列向左移动(排除当前列)
- 当前值 < 目标值→ 目标一定在下边,行向下移动(排除当前行)
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° = 上下翻转 + 主对角线翻转
- 上下翻转:第 i 行 ↔ 第 n-1-i 行
- 对角线翻转:(i,j) ↔ (j,i)
- 空间复杂度 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
通用思路模板(必背)
有序矩阵查找 = 右上角起点贪心搜索
- 起点:右上角 (0, n-1)
- 规则:
- 比 target 大 →向左走(排除整列)
- 比 target 小 →向下走(排除整行)
- 相等 → 找到
- 时间 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°
搜索矩阵
右上角起步,大了左走,小了下走一步排除一行 / 一列,效率最高