classSolution { publicint[] circularGameLosers(int n, int k) { Set<Integer> set = newHashSet<>(); intindex=1, multiple = 1; while (true) { if (set.contains(index)) break; set.add(index); inttemp= index + multiple * k; if (temp % n == 0) index = n; else index = temp % n; multiple++; } List<Integer> res = newLinkedList<>(); for (inti=1; i <= n; ++i) { if (set.contains(i)) continue; res.add(i); } return res.stream().mapToInt(i->i).toArray(); } }
classSolution { publicintmaxMoves(int[][] grid) { m = grid.length; n = grid[0].length; this.grid = grid; dp = newint[m][n]; for (int[] arr : dp) Arrays.fill(arr, -1); intres=0; for (intj=0; j < m; ++j) { res = Math.max(res, dfs(j, 0)); } return res; }
privateintdfs(int i, int j) { if (j == n - 1) return0; if (dp[i][j] != -1) return dp[i][j]; intres=0; for (int[] dir : dirs) { introw= i + dir[0], col = j + dir[1]; if (isValid(row, col) && grid[row][col] > grid[i][j]) res = Math.max(res, dfs(row, col) + 1); } return dp[i][j] = res; }
int m, n; int[][] dp, grid, dirs = newint[][]{{0, 1}, {-1, 1}, {1, 1}};
privatebooleanisValid(int i, int j) { return i >= 0 && j >= 0 && i < m && j < n; } }
时间复杂度:\(O(mn)\)
方法二:DP
记忆化搜索(自动挡)转DP(手动挡)需要考虑
初始化
遍历顺序
步骤
记忆化搜索转DP,有几个状态(i,j)就有几个for循环
状态转移方程直接搬过来
1 2
if (isValid(row, col) && grid[row][col] > grid[i][j]) res = Math.max(res, dfs(row, col) + 1);
classSolution { publicintmaxMoves(int[][] grid) { m = grid.length; n = grid[0].length; this.grid = grid; dp = newint[m][n]; intres=0; for (intj= n - 2; j >= 0; --j) for (inti=0; i < m; ++i) for (int[] dir : dirs) { introw= i + dir[0], col = j + dir[1]; if (isValid(row, col) && grid[i][j] < grid[row][col]) dp[i][j] = Math.max(dp[i][j], dp[row][col] + 1); } for (inti=0; i < m; ++i) res = Math.max(res, dp[i][0]); return res; }
int m, n; int[][] dp, grid, dirs = newint[][]{{0, 1}, {-1, 1}, {1, 1}};
privatebooleanisValid(int i, int j) { return i >= 0 && j >= 0 && i < m && j < n; } }