一、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;
}
};