You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class_2022_10_4_week;
// 来自学员问题
// 给定一个二维数组matrix
// 每个格子都是正数,每个格子都和上、下、左、右相邻
// 你可以从任何一个格子出发,走向相邻的格子
// 把沿途的数字乘起来希望得到的最终数字中结尾的0最多
// 走的过程中,向左走或者向右走的拐点,最多只能有一次
// 返回结尾最多的0能是多少
// 1 <= 行、列 <= 400
public class Code02_MostTrailingZerosTurnLeftOfRightAtMostOnce {
public static int mostTrailingZeros(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
// f2[i][j] : matrix[i][j]自己有几个2的因子
int[][] f2 = new int[n][m];
// f5[i][j] : matrix[i][j]自己有几个5的因子
int[][] f5 = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
f2[i][j] = factors(matrix[i][j], 2);
f5[i][j] = factors(matrix[i][j], 5);
}
}
int[][] leftF2 = new int[n][m];
int[][] leftF5 = new int[n][m];
int[][] upF2 = new int[n][m];
int[][] upF5 = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
leftF2[i][j] = f2[i][j] + (j > 0 ? leftF2[i][j - 1] : 0);
leftF5[i][j] = f5[i][j] + (j > 0 ? leftF5[i][j - 1] : 0);
upF2[i][j] = f2[i][j] + (i > 0 ? upF2[i - 1][j] : 0);
upF5[i][j] = f5[i][j] + (i > 0 ? upF5[i - 1][j] : 0);
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 来到(i,j)
int l2 = j == 0 ? 0 : leftF2[i][j - 1];
int l5 = j == 0 ? 0 : leftF5[i][j - 1];
int r2 = leftF2[i][m - 1] - leftF2[i][j];
int r5 = leftF5[i][m - 1] - leftF5[i][j];
int u2 = i == 0 ? 0 : upF2[i - 1][j];
int u5 = i == 0 ? 0 : upF5[i - 1][j];
int d2 = upF2[n - 1][j] - upF2[i][j];
int d5 = upF5[n - 1][j] - upF5[i][j];
int p1 = Math.min(l2 + u2 + f2[i][j], l5 + u5 + f5[i][j]);
int p2 = Math.min(l2 + r2 + f2[i][j], l5 + r5 + f5[i][j]);
int p3 = Math.min(l2 + d2 + f2[i][j], l5 + d5 + f5[i][j]);
int p4 = Math.min(u2 + r2 + f2[i][j], u5 + r5 + f5[i][j]);
int p5 = Math.min(u2 + d2 + f2[i][j], u5 + d5 + f5[i][j]);
int p6 = Math.min(r2 + d2 + f2[i][j], r5 + d5 + f5[i][j]);
ans = Math.max(ans, Math.max(Math.max(p1, p2), Math.max(Math.max(p3, p4), Math.max(p5, p6))));
}
}
return ans;
}
public static int factors(int num, int f) {
int ans = 0;
while (num % f == 0) {
ans++;
num /= f;
}
return ans;
}
public static void main(String[] args) {
int[][] matrix1 = { { 5, 8, 3, 1 }, { 4, 15, 12, 1 }, { 6, 7, 10, 1 }, { 9, 1, 2, 1 } };
System.out.println(mostTrailingZeros(matrix1));
int[][] matrix2 = { { 7500, 10, 11, 12 }, { 6250, 13, 14, 15 }, { 134, 17, 16, 1 }, { 5500, 2093, 5120, 238 } };
System.out.println(mostTrailingZeros(matrix2));
}
}