【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;
    }
};
相关推荐
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表
jrrz08283 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time3 小时前
golang学习2
算法
南宫生4 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步5 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara5 小时前
函数对象笔记
c++·算法
泉崎5 小时前
11.7比赛总结
数据结构·算法
你好helloworld5 小时前
滑动窗口最大值
数据结构·算法·leetcode