leetcode hot100(4)矩阵

73.矩阵置零

思路:

遍历一次数组,当元素为0则元素所在行和列状态都设为0,遍历结束后统一更替。

要想空间复杂度达到O(1),就用数组的第一行第i列表示i列是否应该置为0,第一列第i行表示i行是否应该设为0。对于第一行和第一列额外开两个变量特判。在遍历数组的过程中如果该行/列应该置为0,他的matrix数组对应的第一行/列的元素已经置为0,后续不需要再特殊处理。

此时遍历n-1的大小的矩阵,将其按照状态置换。最后根据判断处理第一行/列。

代码:

时间复杂度O(m+n)

空间复杂度O(1)

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int n=matrix.size();
        int m=matrix[0].size();
        bool row1=0;
        bool col1=0;
        for(int i=0;i<n;i++){
            if(matrix[i][0]==0){
                col1=1;
            }
        }
        for(int j=0;j<m;j++){
            if(matrix[0][j]==0){
                row1=1;
            }
        }
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<m;j++)
            {
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
         for(int i=1;i<n;i++)
        {
            for(int j=1;j<m;j++)
            {
                if(matrix[i][0]==0||matrix[0][j]==0)
                {
                    matrix[i][j]=0;
                }
            }
        }
        if(col1==1){
            for(int i=0;i<n;i++){
                matrix[i][0]=0;
            }
        }
        if(row1==1){
            for(int j=0;j<m;j++){
                matrix[0][j]=0;
            }
        }
    }
};

54.螺旋矩阵

思路:

直接模拟,但不同于不控制边界,一旦发现下一步越界了或者走到了已经访问过的格子,就立刻顺时针切换方向。

此方法利用边界变量控制行走的范围,按顺时针方向逐层收缩,不需要额外开数组记录格子是否走过。

代码:

时间复杂度:O(m*n)m,n为行列数

空间复杂度:抛开输出数组,空间复杂度为O(1)

cpp 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.size()==0  ||matrix[0].size()==0)
        return{};

        vector<int>ans;
        int rowBegin=0,rowEnd=matrix.size()-1;
        int colBegin=0,colEnd=matrix[0].size()-1;
        while(true){
            for(int i=colBegin;i<=colEnd;i++){
                ans.push_back(matrix[rowBegin][i]);
            }
            if(++rowBegin>rowEnd)break;
            for(int i=rowBegin;i<=rowEnd;i++){
                ans.push_back(matrix[i][colEnd]);
            }
            if(--colEnd<colBegin)break;
            for(int i=colEnd;i>=colBegin;i--){
                ans.push_back(matrix[rowEnd][i]);
            }
            if(--rowEnd<rowBegin)break;
            for(int i=rowEnd;i>=rowBegin;i--){
                ans.push_back(matrix[i][colBegin]);
            }
            if(++colBegin>colEnd)break;
        }
        return ans;
    }
};

48.旋转图像

思路:

先上下对称旋转,再主对角线对称旋转。

代码:

时间复杂度O(n的二次方)

空间复杂度O(1)

cpp 复制代码
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; j++) {
                swap(matrix[i][j], matrix[n - i - 1][j]);
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                swap(matrix[i][j], matrix[j][i]);
            }
        
    }
    }
};

240.搜索二维矩阵II

思路:

从最右上方点(x,y)开始,如果matrixxy小于需要值,那么一定不在他左侧,向下移动一格,如果大于需要值,一定不在他下侧,向左移动一格,直到找到即可。

如果到了边界还没有找到就是false,时间复杂度为O(n+m),n m为数组长宽

代码:

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int i=matrix.size()-1;
        int j=0;
        while(j>=0 && j<matrix[0].size()){
            if(matrix[i][j]>target )
            {
                if(i==0){
                    return false;
                }
                else{i--;}
            }
            else if(matrix[i][j]<target)
            j++;
            else return true;
        }
        return false;
    }
};
相关推荐
小宋加油啊4 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
lqqjuly4 小时前
前沿算法深度解析(一)
算法
小欣加油5 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
happymaker06267 小时前
LeetCodeHot100——42.接雨水
算法
阿正的梦工坊8 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
企业老板ai培训9 小时前
2026中小企业AI应用落地白皮书:从AI短视频矩阵到数字人获客的破局增长趋势
人工智能·矩阵·音视频
八解毒剂9 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
运行时记录9 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法
啦啦啦啦啦zzzz10 小时前
算法总结(二分查找、双指针)
c++·算法