转角路径的乘积中最多能有几个尾随零

 

前缀和+枚举

 

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;
    }
}

 

posted @ 2022-04-18 17:28  fishcanfly  阅读(31)  评论(0)    收藏  举报
//雪花飘落效果