---
# System prepended metadata

title: 1992. Find All Groups of Farmland
tags: [Leetcode, DFS, Medium]

---

# 1992. Find All Groups of Farmland
###### tags: `Leetcode` `Medium` `DFS`
Link: https://leetcode.com/problems/find-all-groups-of-farmland/description/
## 思路
[参考](https://leetcode.com/problems/find-all-groups-of-farmland/solutions/1451820/mark-left-side/)
### 思路一 O(2mn)
遍历land array 当发现一个位置值是1的时候 说明发现一个farmland 遍历整个farmland 并把相应位置设置成0 防止重复遍历 最后把当下farmland加进答案
### 思路二 O(mn)
遍历land array 当发现一个位置值是1的时候 说明发现一个farmland
接下来首先找到这个farmland占了几个column ```col```
然后我们把这个land的左边界的每个位置都标成```col+1``` 表示下次遍历到这里时可以直接跳过```col```个格子
如果发现一个位置值是大于1的话 说明这里已经遍历过 直接跳过就好
要注意的是左边标的是```col+1``` 而不是```col``` 这样即使只占了一个column我们也会知道我们遍历过这里了 从而跳过一个格子 避免重复
## Code
### 思路一
```java=
class Solution {
    public int[][] findFarmland(int[][] land) {
        int m = land.length, n = land[0].length;
        List<int[]> res = new ArrayList<>();
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(land[i][j]==1){
                    int ii = i, jj = j;
                    for(ii=i; ii<m && land[ii][j]==1; ii++){
                        for(jj=j; jj<n && land[ii][jj]==1; jj++){
                            land[ii][jj]=0;
                        }
                    }
                    res.add(new int[]{i, j, ii-1, jj-1});
                }
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}
```
### 思路二
```python=
class Solution:
    def findFarmland(self, land: List[List[int]]) -> List[List[int]]:
        ans = []
        m, n = len(land), len(land[0])
        i, j = 0, 0
        while i<m:
            j = 0
            while j<n:
                if land[i][j]==1:
                    ii, jj = i, j
                    while jj<n and land[i][jj]==1: jj += 1
                    while ii<m and land[ii][j]==1:
                        land[ii][j] = jj-j+1
                        ii += 1
                    ans.append([i, j, ii-1, jj-1])
                if land[i][j]>1:
                    j += land[i][j]-1
                j += 1
            i += 1
        return ans
```