leecode矩阵

   leecode矩阵

73.矩阵置0

image

思路:记录原始为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.螺旋矩阵

image

代码

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.旋转图像

难:在原地旋转不借助辅助矩阵

image

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

image

代码
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;
            }
        }
    }
};
posted @ 2025-09-09 08:50  Annaprincess  阅读(4)  评论(0)    收藏  举报