【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;
    }
};
相关推荐
艾莉丝努力练剑4 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
ZZZS051613 分钟前
stack栈练习
c++·笔记·学习·算法·动态规划
黑听人18 分钟前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
hans汉斯38 分钟前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
vortex52 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划
前端拿破轮3 小时前
🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!
算法·leetcode·面试
地平线开发者3 小时前
征程 6|工具链量化简介与代码实操
算法·自动驾驶
DoraBigHead3 小时前
🧠 小哆啦解题记——谁偷改了狗狗的台词?
算法
Kaltistss3 小时前
240.搜索二维矩阵Ⅱ
线性代数·算法·矩阵
轻语呢喃3 小时前
每日LeetCode:合并两个有序数组
javascript·算法