1. 解题思路
这一题是leetcode周赛482的第四题,是一道hard的题目。
这一题其实算是一个标准的模板题了,就是转换为求不超过 n n n的平衡数,然后使用动态规划进行解答即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def countBalanced(self, low: int, high: int) -> int:
def count_balanced(num):
if num <= 10:
return 0
digits = [int(digit) for digit in str(num)]
n = len(digits)
@lru_cache(None)
def dp(idx, is_zero, allow_bigger, flag, delta):
if idx == n-1:
if is_zero:
return 0
need = -delta if flag == 1 else delta
if allow_bigger and (0 <= need <= 9):
return 1
elif not allow_bigger and (0 <= need <= digits[-1]):
return 1
else:
return 0
if flag == 1 and ((n-idx+1)//2) * 9 + delta < 0:
return 0
elif flag == -1 and -((n-idx+1)//2) * 9 + delta > 0:
return 0
if is_zero:
ans = dp(idx+1, True, True, 1, 0)
if allow_bigger:
for i in range(1, 10):
ans += dp(idx+1, False, True, -1, i)
else:
for i in range(1, digits[idx]):
ans += dp(idx+1, False, True, -1, i)
ans += dp(idx+1, False, False, -1, digits[idx])
else:
ans = 0
if allow_bigger:
for i in range(10):
ans += dp(idx+1, False, True, -flag, delta + flag*i)
else:
for i in range(digits[idx]):
ans += dp(idx+1, False, True, -flag, delta + flag*i)
ans += dp(idx+1, False, False, -flag, delta + flag*digits[idx])
return ans
ans = dp(0, True, False, 1, 0)
return ans
return count_balanced(high) - count_balanced(low-1)
提交代码评测得到:耗时1129ms,占用内存25.79MB。
1886

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



