- Leetcode 3495. Minimum Operations to Make Array Elements Zero
- 1. 解题思路
- 2. 代码实现
- 题目链接: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=1∑n⌈log4(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 nans = 3for r in range(4):k = (n-r) // 4ans += k + count4(k)return ansclass Solution:def minOperations(self, queries: List[List[int]]) -> int:ans = 0for l, r in queries:need = count4(r)-count4(l-1)ans += (need+1)//2return ans
提交代码评测得到:耗时4619ms,占用内存556MB。