# 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 ```