leetcode 矩阵问题合集

一、leetcode 200 岛屿数量
题目描述:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

思路:
dfs

代码如下:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int res=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if(grid[i][j]=='1'){
                    res++;
                    dfs(grid,i,j);
                }
            }
        }
        return res;
    }
    void dfs(vector<vector<char>>&grid,int i,int j){
        if(i>=0&&i<grid.size()&&j>=0&&j<grid[0].size()&&grid[i][j]=='1'){
            grid[i][j]='2';
            dfs(grid,i+1,j);
            dfs(grid,i,j+1);
            dfs(grid,i-1,j);
            dfs(grid,i,j-1);
        }
    }
};

二、leetcode 1074 元素和为目标值的子矩阵数量
题目描述:
给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。

子矩阵 x1, y1, x2, y2 是满足 x1 <= x <= x2 且 y1 <= y <= y2 的所有单元 matrix[x][y] 的集合。

如果 (x1, y1, x2, y2) 和 (x1’, y1’, x2’, y2’) 两个子矩阵中部分坐标不同(如:x1 != x1’),那么这两个子矩阵也不同。

思路:
二维矩阵化一维矩阵,并用前缀和查询

代码如下:

class Solution {
public:
    int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) {
        int row=matrix.size();
        int col=matrix[0].size();
        int res=0;
        for(int i=0;i<row;i++){
            vector<int>sum(col,0);
            for(int j=i;j>=0;j--){
                for(int k=0;k<col;k++){
                    sum[k]+=matrix[j][k];
                }
                for(int m=0;m<sum.size();m++){
                    int sum1=0;
                    for(int n=m;n<sum.size();n++){
                        sum1+=sum[n];
                        if(sum1==target){
                            res++;
                        }
                    }
                }
            }
        }
        return res;
    }
};

三、leetcode 1277 统计全为1的正方形的子矩阵
题目描述:
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。

思路:
动态规划

代码如下:

class Solution {
public:
    int countSquares(vector<vector<int>>& matrix) {
        int row=matrix.size();
        int col=matrix[0].size();
        int res=0;
        vector<vector<int>>dp(row+1,vector<int>(col+1,0));
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(matrix[i][j]==1){
                    dp[i+1][j+1]=min(dp[i][j],min(dp[i][j+1],dp[i+1][j]))+1;
                    res+=dp[i+1][j+1];
                }
            }
        }
        return res;
    }
};

四、leetcode 1504 统计全为1的子矩形
题目描述:
给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。

思路:
动态规划

代码如下:

class Solution {
public:
    int numSubmat(vector<vector<int>>& mat) {
        int n=mat.size();
        int m=mat[0].size();
        vector<vector<int>>dp(n,vector<int>(m,0));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(j==0){
                    dp[i][j]=mat[i][j];
                }
                else if(mat[i][j]){
                    dp[i][j]=dp[i][j-1]+1;
                }
                else{
                    dp[i][j]=0;
                }
            }
        }
        int res=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                int temp=dp[i][j];
                for(int k=i;k>=0;k--){
                    temp=min(temp,dp[k][j]);
                    res+=temp;
                }
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值