【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;
    }
};
相关推荐
半盏茶香18 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
CodeJourney.38 分钟前
小型分布式发电项目优化设计方案
算法
木与长清1 小时前
利用MetaNeighbor验证重复性和跨物种分群
矩阵·数据分析·r语言
带多刺的玫瑰1 小时前
Leecode刷题C语言之从栈中取出K个硬币的最大面积和
数据结构·算法·图论
Cando学算法1 小时前
Codeforces Round 1000 (Div. 2)(前三题)
数据结构·c++·算法
薯条不要番茄酱1 小时前
【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
算法·动态规划
小林熬夜学编程1 小时前
【Python】第三弹---编程基础进阶:掌握输入输出与运算符的全面指南
开发语言·python·算法
字节高级特工1 小时前
【优选算法】5----有效三角形个数
c++·算法
小孟Java攻城狮7 小时前
leetcode-不同路径问题
算法·leetcode·职场和发展
查理零世7 小时前
算法竞赛之差分进阶——等差数列差分 python
python·算法·差分