LeetCode 2719. Count of Integers Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
2719. Count of Integers

Description

You are given two numeric strings num1 and num2 and two integers max_sum and min_sum. We denote an integer x to be good if:

  • num1 <= x <= num2
  • min_sum <= digit_sum(x) <= max_sum.

Return the number of good integers. Since the answer may be large, return it modulo 109 + 7.

Note that digit_sum(x) denotes the sum of the digits of x.

 

Example 1:

Input: num1 = "1", num2 = "12", min_sum = 1, max_sum = 8
Output: 11
Explanation: There are 11 integers whose sum of digits lies between 1 and 8 are 1,2,3,4,5,6,7,8,10,11, and 12. Thus, we return 11.

Example 2:

Input: num1 = "1", num2 = "5", min_sum = 1, max_sum = 5
Output: 5
Explanation: The 5 integers whose sum of digits lies between 1 and 5 are 1,2,3,4, and 5. Thus, we return 5.

 

Constraints:

  • 1 <= num1 <= num2 <= 1022
  • 1 <= min_sum <= max_sum <= 400

Solutions

Solution 1: Digit DP

The problem is actually asking for the number of integers in the range [num1,..num2] whose digit sum is in the range [minsum,..maxsum]. For this kind of range [l,..r] problem, we can consider transforming it into finding the answers for [1,..r] and [1,..l-1], and then subtracting the latter from the former.

For the answer to [1,..r], we can use digit DP to solve it. We design a function dfs(pos, s, limit), which represents the number of schemes when we are currently processing the posth digit, the digit sum is s, and whether the current number has an upper limit limit. Here, pos is enumerated from high to low.

For dfs(pos, s, limit), we can enumerate the value of the current digit i, and then recursively calculate dfs(pos+1, s+i, limit \bigcap i==up), where up represents the upper limit of the current digit. If limit is true, then up is the upper limit of the current digit, otherwise up is 9. If pos is greater than or equal to the length of num, then we can judge whether s is in the range [minsum,..maxsum]. If it is, return 1, otherwise return 0.

The time complexity is O(10 × n × maxsum), and the space complexity is O(n × maxsum). Here, n represents the length of num.

Similar problems:

PythonJavaC++GoTypeScript
class Solution: def count(self, num1: str, num2: str, min_sum: int, max_sum: int) -> int: @cache def dfs(pos: int, s: int, limit: bool) -> int: if pos >= len(num): return int(min_sum <= s <= max_sum) up = int(num[pos]) if limit else 9 return ( sum(dfs(pos + 1, s + i, limit and i == up) for i in range(up + 1)) % mod ) mod = 10**9 + 7 num = num2 a = dfs(0, 0, True) dfs.cache_clear() num = str(int(num1) - 1) b = dfs(0, 0, True) return (a - b) % mod(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !