- 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 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。