【LeetCode 热题 100】矩阵 专题(大多原地算法,需要一定思维)

解题思路 在 代码注释中!

文章目录

    • [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;
    }
};
相关推荐
VertexGeek34 分钟前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz35 分钟前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
jiao_mrswang1 小时前
leetcode-18-四数之和
算法·leetcode·职场和发展
qystca2 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
薯条不要番茄酱2 小时前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
今天吃饺子2 小时前
2024年SCI一区最新改进优化算法——四参数自适应生长优化器,MATLAB代码免费获取...
开发语言·算法·matlab
是阿建吖!2 小时前
【优选算法】二分查找
c++·算法
王燕龙(大卫)2 小时前
leetcode 数组中第k个最大元素
算法·leetcode
不去幼儿园3 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
Mr_Xuhhh3 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法