Leetcode 3791. Number of Balanced Integers in a Range

  • [Leetcode 3791. Number of Balanced Integers in a Range](#Leetcode 3791. Number of Balanced Integers in a Range)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题是leetcode周赛482的第四题,是一道hard的题目。

这一题其实算是一个标准的模板题了,就是转换为求不超过 n n n的平衡数,然后使用动态规划进行解答即可。

2. 代码实现

给出python代码实现如下:

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。

相关推荐
Espresso Macchiato20 天前
Leetcode 3782. Last Remaining Integer After Alternating Deletion Operations
迭代·leetcode hard·leetcode双周赛172·leetcode 3782
Espresso Macchiato21 天前
Leetcode 3768. Minimum Inversion Count in Subarrays of Fixed Length
滑动窗口·leetcode hard·leetcode双周赛171·leetcode 3768
Espresso Macchiato21 天前
Leetcode 3785. Minimum Swaps to Avoid Forbidden Values
leetcode hard·leetcode周赛481·leetcode 3785
Espresso Macchiato21 天前
Leetcode 3786. Total Sum of Interaction Cost in Tree Groups
leetcode hard·leetcode 3786·leetcode周赛481
Espresso Macchiato21 天前
Leetcode 3790. Smallest All-Ones Multiple
leetcode medium·leetcode 3790·leetcode周赛482
Espresso Macchiato2 个月前
Leetcode 3748. Count Stable Subarrays
算法·leetcode·职场和发展·leetcode hard·leetcode 3748·leetcode周赛476·区间求和
Espresso Macchiato2 个月前
Leetcode 3739. Count Subarrays With Majority Element II
leetcode hard·前序和数组·leetcode双周赛169·leetcode 3739
Espresso Macchiato3 个月前
Leetcode 3729. Count Distinct Subarrays Divisible by K in Sorted Array
leetcode·leetcode hard·容斥原理·leetcode 3729·leetcode周赛473·前序和数组
Espresso Macchiato3 个月前
Leetcode 3715. Sum of Perfect Square Ancestors
算法·leetcode·职场和发展·leetcode hard·树的遍历·leetcode 3715·leetcode周赛471