【力扣Hot 100】矩阵1
矩阵置零:1. 开两个数组判断该行/该列是否有0;2. 用第0行/第0列分别判断该列/该行是否有0
螺旋矩阵:记录方向,一直按某方向前进,遇到障碍方向就变一下
1. 矩阵置零
给定一个 *m* x *n*
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。**
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
231 <= matrix[i][j] <= 231 - 1
题解
开两个数组row, col, 分别记录该行该列是否有0
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<bool> row(m, false), col(n, false);
for(int i = 0; i < m; i ++ ) {
for(int j = 0; j < n; j ++ ) {
if(!matrix[i][j]) {
row[i] = true;
col[j] = true;
}
}
}
for(int i = 0; i < m; i ++ ) {
for(int j = 0; j < n; j ++ ) {
if(row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}
};
优化方法:用第0行第0列来表示该行/该列是否有0,对于第0行和第0列是否有0,单独用两个变量来记录。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
bool row0 = false, col0 = false;
// 记录第0列是否有0
for(int i = 0; i < m; i ++ ) {
if(!matrix[i][0]) {
col0 = true;
break;
}
}
// 记录第0行是否有0
for(int i = 0; i < n; i ++ ) {
if(!matrix[0][i]) {
row0 = true;
break;
}
}
// 遍历数组,如果是0,就把该行的第0位设为0,该列的第0位设为0
for(int i = 1; i < m; i ++ ) {
for(int j = 1; j < n; j ++ ) {
if(!matrix[i][j]) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < m; i ++ ) {
for(int j = 1; j < n; j ++ ) {
if(!matrix[0][j] || !matrix[i][0]) {
matrix[i][j] = 0;
}
}
}
if(row0) {
for(int i = 0; i < n; i ++ ) {
matrix[0][i] = 0;
}
}
if(col0) {
for(int i = 0; i < m; i ++ ) {
matrix[i][0] = 0;
}
}
}
};
2. 螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
100 <= matrix[i][j] <= 100
题解
dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0}
dir = 0;
从第0个方向开始,一直走到不能走的位置,再更换方向。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int dir = 0;
vector<int> ans;
vector<vector<bool>> vis(m, vector<bool>(n));
int x = 0, y = 0;
for(int i = 0; i < m * n; i ++ ) {
ans.push_back(matrix[x][y]);
vis[x][y] = true;
int nx = x + dx[dir], ny = y + dy[dir];
if(nx < 0 || nx >= m || ny < 0 || ny >= n || vis[nx][ny]) {
dir = (dir + 1) % 4;
nx = x + dx[dir];
ny = y + dy[dir];
}
x = nx;
y = ny;
}
return ans;
}
};