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,对应列全置为0for (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
