Leetcode 2245. Maximum Trailing Zeros in a Cornered Path

本篇博客讨论了LeetCode周赛289中的一道难题,探讨如何计算角落路径上的最大尾随零。通过分析每个位置数字的2和5因子,使用前缀和技巧来确定0的数量。博客提到了以每个位置作为转折点进行四种组合的枚举方法,并指出即使在边界条件下,答案也是正确的。时间复杂度为O(mnk),其中m为函数,n为列数,k为数字因子分解的复杂度。空间复杂度为O(m*n)。博客提供了Python3解决方案的链接和后续计划实现C++版本的参考链接。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述

解法:

Weekly Contest 289的题目,自己感觉有点变态,当时没做出来
这道题需要解决一下几个问题:

  1. 如何数trailing zero
  2. 如何枚举这些符合条件形状的所有可能性

第一个问题最优解是,所有的0都只可能是2*5得到,所以可以把每个位置数字分解,记录每个数字以2为因子和以5为因子的个数。可以通过一个形状能组成多少个2,5的pair来得到多少个0。由于要累计这些个数,所以使用prefixsum技巧
枚举这些形状可能性最好操作的方案是把每个位置作为形状的turning point,这样就可以每个位置穷举四种组合即可。可以验证即使当前位置在第一行或者第一列(可能会有方向无法组成有效的形状),最后的答案也不会有问题

class Solution:
    def maxTrailingZeros(self, grid: List[List[int]]) -> int:
        # helper function to get the number of factors of 2 and 5 in a number
        def helper(num,f):
            if num % f != 0:
                return 0
            return 1 + helper(num // f,f)
        m,n = len(grid),len(grid[0])
        # left represents the rowwise left to right prefix sum of factor of 2 and 5 numbers
        left = [[[0,0] for _ in range(n)] for _ in range(m)]
        # top represents the columnwise top to down prefix sum of factor of 2 and 5 numbers
        top = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值