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;
    }
};
相关推荐
淡海水1 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan2 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy2 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息3 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
木井巳5 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊5 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥5 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
shehuiyuelaiyuehao5 小时前
算法34,位运算符操作,总结
算法
Navigator_Z6 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z6 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode