1. 解题思路
这一题是Leetcode双周赛170的第四题,是一道hard的题目。
这一题本质上和题目Leetcode 3751. Total Waviness of Numbers in Range I是完全一样的,不过就是复杂度要求更高一些而已。
思路上,这议题就是求范围内的wave的总数,我们很容易将其转换为求 0 0 0到 n n n当中所有的wave的总数的问题,此时,目标问题的解就是上下边界的解的差值。
由此,我们将问题转换为了如何求 0 0 0到 n n n当中所有的wave的总数,而这个我们只需要使用动态规划即可。
我们考察每一个数与其前两位的pair,如果他们可以构成一个wave,那么我们就只需要考虑这个wave后续会被count的总数,然后考察下一位即可。
2. 代码实现
给出python代码实现如下:
def count_waviness(n):
s = str(n)
m = len(s)
@lru_cache(None)
def dp(idx, x, y, allow_larger, digit_num):
ans = 0
if idx >= m:
return ans
if allow_larger:
for z in range(10):
if z == 0 and digit_num == 0:
ans += dp(idx+1, y, z, True, 0)
elif digit_num >= 2 and x > y and z > y:
ans += 10**(m-1-idx) + dp(idx+1, y, z, True, digit_num+1)
elif digit_num >= 2 and x < y and z < y:
ans += 10**(m-1-idx) + dp(idx+1, y, z, True, digit_num+1)
else:
ans += dp(idx+1, y, z, True, digit_num+1)
else:
upper_bound = int(s[idx])
for z in range(upper_bound+1):
if z == 0 and digit_num == 0:
ans += dp(idx+1, y, z, True, 0)
elif digit_num >= 2 and x > y and z > y:
if z == upper_bound:
remain = int(s[idx+1:])+1 if idx+1 < m else 1
ans += remain + dp(idx+1, y, z, False, digit_num+1)
else:
ans += 10**(m-1-idx) + dp(idx+1, y, z, True, digit_num+1)
elif digit_num >= 2 and x < y and z < y:
if z == upper_bound:
remain = int(s[idx+1:])+1 if idx+1 < m else 1
ans += remain + dp(idx+1, y, z, False, digit_num+1)
else:
ans += 10**(m-1-idx) + dp(idx+1, y, z, True, digit_num+1)
else:
ans += dp(idx+1, y, z, z < upper_bound, digit_num+1)
return ans
ans = dp(0, 0, 0, False, 0)
return ans
class Solution:
def totalWaviness(self, num1: int, num2: int) -> int:
return count_waviness(num2) - count_waviness(num1-1)
提交代码评测得到:耗时1631ms,占用内存69.69MB。
2920

被折叠的 条评论
为什么被折叠?



