Google – Maximum Perimeter of Same Color
有一个grid,每个cell有一个颜色,然后现在给一个坐标(i, j),求从这个点出发,沿着相同颜色走,找出一个颜色相同区域使得这个区域的周长最大。
[Solution]
dfs,每到一个cell, 有4条边,check上下左右四个方向,如果哪个方向上的cell颜色相同,就减一条边。
这题不用回溯,直接一路dfs到底。
Read full article from Google – Maximum Perimeter of Same Color
有一个grid,每个cell有一个颜色,然后现在给一个坐标(i, j),求从这个点出发,沿着相同颜色走,找出一个颜色相同区域使得这个区域的周长最大。
[Solution]
dfs,每到一个cell, 有4条边,check上下左右四个方向,如果哪个方向上的cell颜色相同,就减一条边。
这题不用回溯,直接一路dfs到底。
class Solution { int result = 0; public int maxPerimeter(int[][] grid, int i, int j) { if (grid == null || grid.length == 0) { return 0; } dfs(grid, i, j, grid[i][j]); return result; } private void dfs(int[][] grid, int i, int j, int color) { if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) { return; } if (grid[i][j] != color) { return; } int curr = 4; grid[i][j] = -1; if (i - 1 >= 0 && (grid[i - 1][j] == color || grid[i - 1][j] == -1)) { curr--; dfs(grid, i - 1, j, color); } if (i + 1 < grid.length && (grid[i + 1][j] == color || grid[i + 1][j] == -1)) { curr--; dfs(grid, i + 1, j, color); } if (j - 1 >= 0 && (grid[i][j - 1] == color || grid[i][j - 1] == -1)) { curr--; dfs(grid, i, j - 1, color); } if (j + 1 < grid[0].length && (grid[i][j + 1] == color || grid[i][j + 1] == -1)) { curr--; dfs(grid, i, j + 1, color); } result += curr; }}