解题思路 在 代码注释中!
文章目录
-
- [73. 矩阵置零](#73. 矩阵置零)
- [54. 螺旋矩阵](#54. 螺旋矩阵)
- [48. 旋转图像](#48. 旋转图像)
- [240. 搜索二维矩阵 II](#240. 搜索二维矩阵 II)
73. 矩阵置零
c++
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
// 难点:原地算法
// 直接复用 matrix 第一行 和 第一列,但是会 覆盖, 所以 单独两个变量 记录 第一行,第一列
// 单独两个变量 记录 第一行,第一列
int r0 = 1, c0 = 1;
int n = matrix.size(), m = matrix[0].size();
for(int j = 0;j < m;j ++ ) {
if(matrix[0][j] == 0) r0 = 0;
}
for(int i = 0;i < n;i ++ ){
if(matrix[i][0] == 0) c0 = 0;
}
for(int i = 1;i < n;i ++ ){
for(int j = 0; j < m;j ++ ){
if(matrix[i][j] == 0) matrix[0][j] = matrix[i][0] = 0;
}
}
// 置0
for(int j = 1; j < m;j ++ ){
if(matrix[0][j] == 0){
for(int i = 0;i < n;i ++ ) matrix[i][j] = 0;
}
}
for(int i = 1;i < n;i ++ ){
if(matrix[i][0] == 0){
for(int j = 0;j < m;j ++ ) matrix[i][j] = 0;
}
}
// 单独的行列
if(!r0)
for(int j = 0;j < m;j ++ ) matrix[0][j] = 0;
if(!c0)
for(int i = 0;i < n;i ++ ) matrix[i][0] = 0;
}
};
54. 螺旋矩阵
c++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
// 方向矢量 模拟
int n = matrix.size(), m = matrix[0].size();
int k = 0;
int dx[4] = {-1,0,1,0}, dy[] = {0,1,0,-1};
bool st[n][m];
memset(st, 0, sizeof st);
vector<int> res;
int x = 0, y = 0, d = 1;
int a, b;
while(k < n * m){
res.push_back(matrix[x][y]);
st[x][y] = true;
int a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]) {
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
k ++ ;
}
return res;
}
};
48. 旋转图像
c++
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
// 原地算法
// 先 对角线翻转(=顺时针180), 然后 左右翻转(=逆时针90) = 顺时针旋转 90 度
int n = matrix.size(), m = matrix[0].size();
// 对角线 翻转
for(int i = 0;i < n;i ++ ){
for(int j = 0;j < i;j ++ ){
swap(matrix[i][j], matrix[j][i]);
}
}
// 左右翻转
for(int i = 0; i < n;i ++ ){
for(int j = 0, k = m - 1; j < k;j ++ , k -- ) swap(matrix[i][j], matrix[i][k]);
}
}
};
240. 搜索二维矩阵 II
c++
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
// 从右上角开始 搜索
int n = matrix.size(), m = matrix[0].size();
int i = 0, j = m - 1;
while(i < n && j >= 0){
if(target > matrix[i][j]) i ++ ;
else if(target < matrix[i][j]) j -- ;
else if(target == matrix[i][j]) return true;
}
return false;
}
};