返回介绍

solution / 2200-2299 / 2245.Maximum Trailing Zeros in a Cornered Path / README_EN

发布于 2024-06-17 01:03:08 字数 9773 浏览 0 评论 0 收藏 0

2245. Maximum Trailing Zeros in a Cornered Path

中文文档

Description

You are given a 2D integer array grid of size m x n, where each cell contains a positive integer.

A cornered path is defined as a set of adjacent cells with at most one turn. More specifically, the path should exclusively move either horizontally or vertically up to the turn (if there is one), without returning to a previously visited cell. After the turn, the path will then move exclusively in the alternate direction: move vertically if it moved horizontally, and vice versa, also without returning to a previously visited cell.

The product of a path is defined as the product of all the values in the path.

Return _the maximum number of trailing zeros in the product of a cornered path found in _grid.

Note:

  • Horizontal movement means moving in either the left or right direction.
  • Vertical movement means moving in either the up or down direction.

 

Example 1:

Input: grid = [[23,17,15,3,20],[8,1,20,27,11],[9,4,6,2,21],[40,9,1,10,6],[22,7,4,5,3]]
Output: 3
Explanation: The grid on the left shows a valid cornered path.
It has a product of 15 * 20 * 6 * 1 * 10 = 18000 which has 3 trailing zeros.
It can be shown that this is the maximum trailing zeros in the product of a cornered path.

The grid in the middle is not a cornered path as it has more than one turn.
The grid on the right is not a cornered path as it requires a return to a previously visited cell.

Example 2:

Input: grid = [[4,3,2],[7,6,1],[8,8,8]]
Output: 0
Explanation: The grid is shown in the figure above.
There are no cornered paths in the grid that result in a product with a trailing zero.

 

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 105
  • 1 <= m * n <= 105
  • 1 <= grid[i][j] <= 1000

Solutions

Solution 1

class Solution:
  def maxTrailingZeros(self, grid: List[List[int]]) -> int:
    m, n = len(grid), len(grid[0])
    r2 = [[0] * (n + 1) for _ in range(m + 1)]
    c2 = [[0] * (n + 1) for _ in range(m + 1)]
    r5 = [[0] * (n + 1) for _ in range(m + 1)]
    c5 = [[0] * (n + 1) for _ in range(m + 1)]
    for i, row in enumerate(grid, 1):
      for j, x in enumerate(row, 1):
        s2 = s5 = 0
        while x % 2 == 0:
          x //= 2
          s2 += 1
        while x % 5 == 0:
          x //= 5
          s5 += 1
        r2[i][j] = r2[i][j - 1] + s2
        c2[i][j] = c2[i - 1][j] + s2
        r5[i][j] = r5[i][j - 1] + s5
        c5[i][j] = c5[i - 1][j] + s5
    ans = 0
    for i in range(1, m + 1):
      for j in range(1, n + 1):
        a = min(r2[i][j] + c2[i - 1][j], r5[i][j] + c5[i - 1][j])
        b = min(r2[i][j] + c2[m][j] - c2[i][j], r5[i][j] + c5[m][j] - c5[i][j])
        c = min(r2[i][n] - r2[i][j] + c2[i][j], r5[i][n] - r5[i][j] + c5[i][j])
        d = min(
          r2[i][n] - r2[i][j - 1] + c2[m][j] - c2[i][j],
          r5[i][n] - r5[i][j - 1] + c5[m][j] - c5[i][j],
        )
        ans = max(ans, a, b, c, d)
    return ans
class Solution {
  public int maxTrailingZeros(int[][] grid) {
    int m = grid.length, n = grid[0].length;
    int[][] r2 = new int[m + 1][n + 1];
    int[][] c2 = new int[m + 1][n + 1];
    int[][] r5 = new int[m + 1][n + 1];
    int[][] c5 = new int[m + 1][n + 1];
    for (int i = 1; i <= m; ++i) {
      for (int j = 1; j <= n; ++j) {
        int x = grid[i - 1][j - 1];
        int s2 = 0, s5 = 0;
        for (; x % 2 == 0; x /= 2) {
          ++s2;
        }
        for (; x % 5 == 0; x /= 5) {
          ++s5;
        }
        r2[i][j] = r2[i][j - 1] + s2;
        c2[i][j] = c2[i - 1][j] + s2;
        r5[i][j] = r5[i][j - 1] + s5;
        c5[i][j] = c5[i - 1][j] + s5;
      }
    }
    int ans = 0;
    for (int i = 1; i <= m; ++i) {
      for (int j = 1; j <= n; ++j) {
        int a = Math.min(r2[i][j] + c2[i - 1][j], r5[i][j] + c5[i - 1][j]);
        int b = Math.min(r2[i][j] + c2[m][j] - c2[i][j], r5[i][j] + c5[m][j] - c5[i][j]);
        int c = Math.min(r2[i][n] - r2[i][j] + c2[i][j], r5[i][n] - r5[i][j] + c5[i][j]);
        int d = Math.min(r2[i][n] - r2[i][j - 1] + c2[m][j] - c2[i][j],
          r5[i][n] - r5[i][j - 1] + c5[m][j] - c5[i][j]);
        ans = Math.max(ans, Math.max(a, Math.max(b, Math.max(c, d))));
      }
    }
    return ans;
  }
}
class Solution {
public:
  int maxTrailingZeros(vector<vector<int>>& grid) {
    int m = grid.size(), n = grid[0].size();
    vector<vector<int>> r2(m + 1, vector<int>(n + 1));
    vector<vector<int>> c2(m + 1, vector<int>(n + 1));
    vector<vector<int>> r5(m + 1, vector<int>(n + 1));
    vector<vector<int>> c5(m + 1, vector<int>(n + 1));
    for (int i = 1; i <= m; ++i) {
      for (int j = 1; j <= n; ++j) {
        int x = grid[i - 1][j - 1];
        int s2 = 0, s5 = 0;
        for (; x % 2 == 0; x /= 2) {
          ++s2;
        }
        for (; x % 5 == 0; x /= 5) {
          ++s5;
        }
        r2[i][j] = r2[i][j - 1] + s2;
        c2[i][j] = c2[i - 1][j] + s2;
        r5[i][j] = r5[i][j - 1] + s5;
        c5[i][j] = c5[i - 1][j] + s5;
      }
    }
    int ans = 0;
    for (int i = 1; i <= m; ++i) {
      for (int j = 1; j <= n; ++j) {
        int a = min(r2[i][j] + c2[i - 1][j], r5[i][j] + c5[i - 1][j]);
        int b = min(r2[i][j] + c2[m][j] - c2[i][j], r5[i][j] + c5[m][j] - c5[i][j]);
        int c = min(r2[i][n] - r2[i][j] + c2[i][j], r5[i][n] - r5[i][j] + c5[i][j]);
        int d = min(r2[i][n] - r2[i][j - 1] + c2[m][j] - c2[i][j], r5[i][n] - r5[i][j - 1] + c5[m][j] - c5[i][j]);
        ans = max({ans, a, b, c, d});
      }
    }
    return ans;
  }
};
func maxTrailingZeros(grid [][]int) (ans int) {
  m, n := len(grid), len(grid[0])
  r2 := get(m+1, n+1)
  c2 := get(m+1, n+1)
  r5 := get(m+1, n+1)
  c5 := get(m+1, n+1)
  for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
      x := grid[i-1][j-1]
      s2, s5 := 0, 0
      for ; x%2 == 0; x /= 2 {
        s2++
      }
      for ; x%5 == 0; x /= 5 {
        s5++
      }
      r2[i][j] = r2[i][j-1] + s2
      c2[i][j] = c2[i-1][j] + s2
      r5[i][j] = r5[i][j-1] + s5
      c5[i][j] = c5[i-1][j] + s5
    }
  }
  for i := 1; i <= m; i++ {
    for j := 1; j <= n; j++ {
      a := min(r2[i][j]+c2[i-1][j], r5[i][j]+c5[i-1][j])
      b := min(r2[i][j]+c2[m][j]-c2[i][j], r5[i][j]+c5[m][j]-c5[i][j])
      c := min(r2[i][n]-r2[i][j]+c2[i][j], r5[i][n]-r5[i][j]+c5[i][j])
      d := min(r2[i][n]-r2[i][j-1]+c2[m][j]-c2[i][j], r5[i][n]-r5[i][j-1]+c5[m][j]-c5[i][j])
      ans = max(ans, max(a, max(b, max(c, d))))
    }
  }
  return
}

func get(m, n int) [][]int {
  f := make([][]int, m)
  for i := range f {
    f[i] = make([]int, n)
  }
  return f
}
function maxTrailingZeros(grid: number[][]): number {
  const m = grid.length;
  const n = grid[0].length;
  const r2 = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
  const c2 = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
  const r5 = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
  const c5 = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
  for (let i = 1; i <= m; ++i) {
    for (let j = 1; j <= n; ++j) {
      let x = grid[i - 1][j - 1];
      let s2 = 0;
      let s5 = 0;
      for (; x % 2 == 0; x = Math.floor(x / 2)) {
        ++s2;
      }
      for (; x % 5 == 0; x = Math.floor(x / 5)) {
        ++s5;
      }
      r2[i][j] = r2[i][j - 1] + s2;
      c2[i][j] = c2[i - 1][j] + s2;
      r5[i][j] = r5[i][j - 1] + s5;
      c5[i][j] = c5[i - 1][j] + s5;
    }
  }
  let ans = 0;
  for (let i = 1; i <= m; ++i) {
    for (let j = 1; j <= n; ++j) {
      const a = Math.min(r2[i][j] + c2[i - 1][j], r5[i][j] + c5[i - 1][j]);
      const b = Math.min(r2[i][j] + c2[m][j] - c2[i][j], r5[i][j] + c5[m][j] - c5[i][j]);
      const c = Math.min(r2[i][n] - r2[i][j] + c2[i][j], r5[i][n] - r5[i][j] + c5[i][j]);
      const d = Math.min(
        r2[i][n] - r2[i][j - 1] + c2[m][j] - c2[i][j],
        r5[i][n] - r5[i][j - 1] + c5[m][j] - c5[i][j],
      );
      ans = Math.max(ans, a, b, c, d);
    }
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文