Leetcode 3495. Minimum Operations to Make Array Elements Zero

1. 解题思路

这一题的话核心就是统计对任意自然数 n n n,从 1 1 1 n n n当中所有的数字对于 4 4 4的阶数之和,用数学公式表达就是:
f ( n ) = ∑ i = 1 n ⌈ l o g 4 ( i ) ⌉ f(n) = \sum\limits_{i=1}^{n} \lceil\mathop{log}_4(i)\rceil f(n)=i=1nlog4(i)⌉

当然,直接的计算这个问题还是比较复杂的,不过我们可以通过迭代的方式对其进行计算,显然 1 , 2 , 3 1,2,3 1,2,3三个数可以一次操作直接处理了,对于剩余的 4 4 4 n n n,我们可以按照对其 4 4 4的余数进行分组,然后进行一次除以 4 4 4的操作,从而得到 4 4 4 1 1 1 ⌊ n 4 ⌋ \lfloor\frac{n}{4}\rfloor 4n的数,这样,我们就将问题简化到从求 1 1 1 n n n变成了求 1 1 1 ⌊ n 4 ⌋ \lfloor\frac{n}{4}\rfloor 4n了。迭代我们即可得到我们最终的问题的解。

然后,有了上述函数 f ( n ) f(n) f(n)之后,事实上我们就得到了任意范围 [ l , r ] [l,r] [l,r]只能的 4 4 4的阶数的和 s s s,而要使之变为 0 0 0,其所需要的操作次数事实上就是 ⌈ s 2 ⌉ \lceil\frac{s}{2}\rceil 2s

综上,我们将其翻译为代码语言即可。

2. 代码实现

给出python代码实现如下:

@lru_cache(None)
def count4(n):
    if n < 4:
        return n
    ans = 3
    for r in range(4):
        k = (n-r) // 4
        ans += k + count4(k)
    return ans

class Solution:
    def minOperations(self, queries: List[List[int]]) -> int:
        ans = 0
        for l, r in queries:
            need = count4(r)-count4(l-1)
            ans += (need+1)//2
        return ans

提交代码评测得到:耗时4619ms,占用内存556MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值