LeetCode 5847. 找到所有的农场组(二位前缀和)
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 5847. 找到所有的农场组(二位前缀和)相关的知识,希望对你有一定的参考价值。
题意:
解法:
找到矩形的左上角,从左上角开始拓展找到右下角即可.
如何拓展:
判断是否可以向右下移动,不能就判断是否可以向右和向下移动,能移则移.
如何判断是否可以移动?用二维前缀和判断是否矩形内全是1即可.
复杂度O(n^3)
code:
const int maxm=333;
int sum[maxm][maxm];
int a[maxm][maxm];
int ask(int i,int j,int x,int y){
return (sum[x][y]-sum[i-1][y]-sum[x][j-1]+sum[i-1][j-1])==(x-i+1)*(y-j+1);
}
class Solution {
public:
vector<vector<int>> findFarmland(vector<vector<int>>& nums) {
//init
memset(sum,0,sizeof sum);
memset(a,0,sizeof a);
//
int n=nums.size(),m=nums[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
a[i+1][j+1]=nums[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
}
vector<vector<int> >ans;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1&&a[i-1][j]==0&&a[i][j-1]==0){
int x=i,y=j;
while(1){
if(x+1<=n&&y+1<=m&&ask(i,j,x+1,y+1)){
x++,y++;
}else if(x+1<=n&&ask(i,j,x+1,y)){
x++;
}else if(y+1<=m&&ask(i,j,x,y+1)){
y++;
}else{
break;
}
}
ans.push_back({i-1,j-1,x-1,y-1});
}
}
}
return ans;
}
};
以上是关于LeetCode 5847. 找到所有的农场组(二位前缀和)的主要内容,如果未能解决你的问题,请参考以下文章