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. 找到所有的农场组(二位前缀和)的主要内容,如果未能解决你的问题,请参考以下文章

第二短路

Mike的农场

BZOJ4177Mike的农场 最小割

LeetCode题目总结

bzoj4177Mike的农场 网络流最小割

LeetCode 0662. 二叉树最大宽度:一组奇怪的数据