1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public int minimumTime(int[][] grid) { int m = grid.length, n = grid[0].length; if (grid[1][0] > 1 && grid[0][1] > 1) return -1; int l = Math.max(m + n - 2, grid[m - 1][n - 1]), r = (int) 1e5; while (l <= r) { int mid = (l + r) >> 1; if (check(mid, grid, m, n)) r = mid - 1; else l = mid + 1; } return l + (l + m + n - 2) % 2; }
public boolean check(int limit, int[][] grid, int m, int n) { boolean[][] visited = new boolean[m][n]; Queue<int[]> q = new LinkedList<>(); q.offer(new int[]{m - 1, n - 1, limit - 1}); visited[m - 1][n - 1] = true; while (!q.isEmpty()) { int[] node = q.poll(); int i = node[0], j = node[1], t = node[2]; if (i == 0 && j == 0) return true; for (int[] dir : dirs) { int row = i + dir[0], col = j + dir[1]; if (isValid(row, col, m, n) && !visited[row][col] && t >= grid[row][col]) { q.offer(new int[]{row, col, t - 1}); visited[row][col] = true; } } } return false; } public boolean isValid(int i, int j, int m, int n) { return i >= 0 && j >= 0 && i < m && j < n; }
int[][] dirs = new int[][]{{1,0}, {-1,0}, {0, 1}, {0, -1}}; }
|