Find All Groups of Farmland

medium array dfs bfs matrix

Problem

Given a binary grid, each rectangular group of 1s represents a farmland with no other farmland adjacent. Return [r1, c1, r2, c2] for each block.

Inputland = [[1,0,0],[0,1,1],[0,1,1]]
Output[[0,0,0,0],[1,1,2,2]]
Two rectangles: a 1×1 at (0,0) and a 2×2 spanning rows 1–2, cols 1–2.

def find_farmland(land):
    m, n = len(land), len(land[0])
    res = []
    for i in range(m):
        for j in range(n):
            if land[i][j] == 1 and (i == 0 or land[i-1][j] == 0) and (j == 0 or land[i][j-1] == 0):
                r, c = i, j
                while r + 1 < m and land[r+1][j] == 1: r += 1
                while c + 1 < n and land[i][c+1] == 1: c += 1
                res.append([i, j, r, c])
    return res
function findFarmland(land) {
  const m = land.length, n = land[0].length, res = [];
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (land[i][j] === 1 && (i === 0 || land[i - 1][j] === 0) && (j === 0 || land[i][j - 1] === 0)) {
        let r = i, c = j;
        while (r + 1 < m && land[r + 1][j] === 1) r++;
        while (c + 1 < n && land[i][c + 1] === 1) c++;
        res.push([i, j, r, c]);
      }
    }
  }
  return res;
}
class Solution {
    public int[][] findFarmland(int[][] land) {
        int m = land.length, n = land[0].length;
        java.util.List<int[]> res = new java.util.ArrayList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (land[i][j] == 1 && (i == 0 || land[i - 1][j] == 0) && (j == 0 || land[i][j - 1] == 0)) {
                    int r = i, c = j;
                    while (r + 1 < m && land[r + 1][j] == 1) r++;
                    while (c + 1 < n && land[i][c + 1] == 1) c++;
                    res.add(new int[]{ i, j, r, c });
                }
            }
        }
        return res.toArray(new int[0][]);
    }
}
vector<vector<int>> findFarmland(vector<vector<int>>& land) {
    int m = land.size(), n = land[0].size();
    vector<vector<int>> res;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (land[i][j] == 1 && (i == 0 || land[i - 1][j] == 0) && (j == 0 || land[i][j - 1] == 0)) {
                int r = i, c = j;
                while (r + 1 < m && land[r + 1][j] == 1) r++;
                while (c + 1 < n && land[i][c + 1] == 1) c++;
                res.push_back({ i, j, r, c });
            }
        }
    }
    return res;
}
Time: O(m·n) Space: O(1) extra