leecode矩阵
leecode矩阵
73.矩阵置0

思路:记录原始为0的元素,对他的对应行、列元素全部变为0
代码
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool f[210][210];//标记初始为0的元素
for (int i = 0; i <matrix.size(); i++) {
for (int j = 0; j <matrix[0].size(); j++) {
if (matrix[i][j]!=0) {
f[i][j] = false;
}
else {
f[i][j] = true;
}
}
}
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (
f[i][j] == true) { // 对初始为0的元素对应行全部置为0,对应列全置为0
for (int t = 0; t < matrix[0].size(); t++) {
matrix[i][t] = 0;
}
for (int k = 0; k < matrix.size(); k++) {
matrix[k][j] = 0;
}
}
}
}
}
};
54.螺旋矩阵

代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int cnt = 0;
int dx[4] = {-1, 1, 0, 0}; // 上下左右,行
int dy[4] = {0, 0, -1, 1}; // 列
int f = 3;
vector<int> ans;
int x = 0;
int y = -1;
bool flag[20][20];//是否访问过了
for (int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
flag[i][j] = false;
}
}
while (cnt < matrix.size() * matrix[0].size()) {
if (f == 3) { // 右
if (
y + dy[f] >= matrix[0].size()||flag[x + dx[f]][y + dy[f]] == true) {
f = 1;
}
} else if (f == 0) {
if ( x + dx[f] < 0||flag[x + dx[f]][y + dy[f]] == true) {
f = 3;
}
} else if (f == 1) {
if (
x + dx[f] >= matrix.size()||flag[x + dx[f]][y + dy[f]] == true) {
f = 2;
}
} else if (f == 2) {
if ( y + dy[f] < 0||flag[x + dx[f]][y + dy[f]] == true) {
f = 0;
}
}
flag[x + dx[f]][y + dy[f]] = true;
ans.push_back(matrix[x+dx[f]][y+dy[f]]);
x=x + dx[f];
y=y+dy[f];
cnt++;
}
return ans;
}
};
思路:
(1)利用方向向量dx、dy控制上下左右走
(2)注意先判断是否越界,再判断是否访问
(3)对于越界或访问过,更换方向标志f
48.旋转图像
难:在原地旋转不借助辅助矩阵

思路:将棋盘分成四份,以黄色区为起点,旋转以他为起点的四个格子(四步)

代码
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+1)/2;j++){
int temp=matrix[i][j];
matrix[i][j]=matrix[n-j-1][i];
matrix[n-1-j][i]=matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j]=matrix[j][n-1-i];
matrix[j][n-1-i]=temp;
}
}
}
};

浙公网安备 33010602011771号