文章目录
- 矩阵相关
- 1. 旋转矩阵
- 2. 搜索二维矩阵
矩阵相关
1. 旋转矩阵
题目描述: 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
题解思路: 先将矩阵上下翻转,然后对矩阵进行对角线翻转。
题解代码:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 使用两次反转,先上下翻转,后对角线翻转
// 上下翻转
for (int i = 0; i < (n / 2); i++) {
for (int j = 0; j < n; j++) {
swap(matrix[i][j], matrix[n-i-1][j]);
}
}
// 对角线翻转
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
关键结论:对于矩阵中的元素
matrix
[
row
]
[
col
]
\textit{matrix}[\textit{row}][\textit{col}]
matrix[row][col],在旋转后,它的新位置为
matrix
new
[
col
]
[
n
−
row
−
1
]
\textit{matrix}_\textit{new}[\textit{col}][n - \textit{row} - 1]
matrixnew[col][n−row−1] 。
2. 搜索二维矩阵
题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
题解思路: 由于每一行都是单调递增的,因此可以逐行使用二分查找,这样就可以将时间复杂度控制在 O ( n l o g m ) O(nlogm) O(nlogm)之内。
题解代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for(const auto& row : matrix){
auto it = lower_bound(row.begin(),row.end(),target);
if( it != row.end() && *it == target){
return true;
}
}
return false;
}
};
注意,需要先判断it != row.end()
,再判断*it == target
,否则,判断*it == target
会不合法,导致未定义行为(Undefined Behavior, UB)
关于
lower_bound(StartIterator, EndIterator, Value)
方法的使用:
StartIterator
:范围开始的迭代器。
EndIterator
:范围结束的迭代器。
Value
:需要查找的值。