转角路径的乘积中最多能有几个尾随零
前缀和+枚举
class Solution { public static void main(String[] args) { Solution solution = new Solution(); solution.maxTrailingZeros(new int[][]{ {534,575,625,84,20,999,35}, {208,318,96,380,819,102,669} }); } public int maxTrailingZeros(int[][] grid) { int m = grid.length; int n = grid[0].length; //预处理 int[][][] row = new int[m][n][2]; int[][][] col = new int[n][m][2]; for (int x = 0; x < m; x++) { row[x][0] = get2s5s(grid[x][0]); for (int y = 1; y < n; y++) { row[x][y] = add(row[x][y - 1], get2s5s(grid[x][y])); } } for (int y = 0; y < n; y++) { col[y][0] = get2s5s(grid[0][y]); for (int x = 1; x < m; x++) { col[y][x] = add(col[y][x - 1], get2s5s(grid[x][y])); } } int max = 0; for (int x = 0; x < m; x++) { int[] ttt = sub(add(col[0][x], row[x][n - 1]), row[x][0]); int zero = getZero(ttt); if (zero > max) { max = zero; } ttt = add(row[x][n-1],sub(col[0][m-1],col[0][x])); zero = getZero(ttt); if(zero>max){ max = zero; } for (int y = 1; y < n; y++) { if (x > 0) { //canup; ttt = add(row[x][y], col[y][x - 1]); zero = getZero(ttt); if (zero > max) { max = zero; } } if (x < m - 1) { //candown; ttt = add(row[x][y], sub(col[y][m - 1], col[y][x])); zero = getZero(ttt); if (zero > max) { max = zero; } } if (y < n - 1 && x > 0) { //右上 ttt = add(sub(row[x][n - 1], row[x][y]), col[y][x]); zero = getZero(ttt); if (zero > max) { max = zero; } } if (y < n - 1 && x < m - 1) { //右下 ttt = add(sub(row[x][n - 1], row[x][y - 1]), sub(col[y][m - 1], col[y][x])); zero = getZero(ttt); if (zero > max) { max = zero; } } } } return max; } public int getZero(int[] arr) { int a = arr[0]; int b = arr[1]; return Math.min(a, b); } public int[] sub(int[] arr, int[] b) { int[] ans = new int[]{arr[0], arr[1]}; for (int i = 0; i < 2; i++) { ans[i] -= b[i]; } return ans; } public int[] add(int[] arr, int[] b) { int[] ans = new int[]{arr[0], arr[1]}; for (int i = 0; i < 2; i++) { ans[i] += b[i]; } return ans; } public int[] get2s5s(int n) { int[] ans = new int[]{0, 0}; int tmp = n; while (tmp % 2 == 0) { ans[0]++; tmp = tmp / 2; } tmp = n; while (tmp % 5 == 0) { ans[1]++; tmp = tmp / 5; } return ans; } }

浙公网安备 33010602011771号