有一個 M*N 的矩陣,每一個元素的值取自[1,2,3...MN] 的集合,且互不相同。設計一個程序,找出相鄰數字的最長路徑。
相鄰數字的定義:在矩陣中上下左右位置相鄰,且值相差爲 1 的數字
例如,下圖矩陣中相鄰數字的最長連接路徑爲 1-2-3-4
9 | 8 | 7 |
---|---|---|
5 | 6 | 4 |
1 | 2 | 3 |
dfs。並使用 visited 數組判斷訪問與否來減小沒必要要的循環。每次遞歸結束後,把當前最長的 list 賦值給 maxList。java
若是某次獲得的 list 長度 > 總數的一半,則它就是最長的路徑。直徑退出外層循環。在返回前對 list 進行排序。數組
public class Solution { ArrayList<Integer> maxList = new ArrayList<Integer>(); ArrayList<Integer> list; boolean[][] visited; int xx, yy; int m, n; int[] dx = {1,-1,0,0}; int[] dy = {0,0,1,-1}; public List<Integer> calcMaxLen(int[][] grid) { if (grid == null || grid.length == 0 || grid[0].length == 0) { return new ArrayList<>(); } m = grid.length; n = grid[0].length; visited = new boolean[m][n]; out: for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (!visited[i][j]) { list = new ArrayList<>(); dfs(grid, i, j); if (list.size() > m*n/2) { maxList = list; break out; } maxList = maxList.size() > list.size()? maxList: list; } } } Collections.sort(maxList, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return o1-o2; } }); return maxList; } private void dfs(int[][] grid, int i, int j) { visited[i][j] = true; list.add(grid[i][j]); for (int d = 0; d < 4; d++) { xx = i + dx[d]; yy = j + dy[d]; if (xx >=0 && xx < m && yy >=0 && yy < n && !visited[xx][yy] && Math.abs(grid[i][j] - grid[xx][yy]) == 1) { dfs(grid, xx, yy); } } } public static void main(String[] args) { int[][] grid = { {9,8,7}, {5,6,4}, {1,2,3}}; Solution s = new Solution(); List<Integer> queue = s.calcMaxLen(grid); System.out.println(queue); } }
695. 島嶼的最大面積