leetcode2719. 统计整数数目

简介: leetcode2719. 统计整数数目

题目

给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数:

num1 <= x <= num2

min_sum <= digit_sum(x) <= max_sum.

请你返回好整数的数目。答案可能很大,请返回答案对 109 + 7 取余后的结果。

注意,digit_sum(x) 表示 x 各位数字之和。

示例 1:

输入:num1 = “1”, num2 = “12”, min_num = 1, max_num = 8

输出:11

解释:总共有 11 个整数的数位和在 1 到 8 之间,分别是 1,2,3,4,5,6,7,8,10,11 和 12 。所以我们返回 11 。

示例 2:

输入:num1 = “1”, num2 = “5”, min_num = 1, max_num = 5

输出:5

解释:数位和在 1 到 5 之间的 5 个整数分别为 1,2,3,4 和 5 。所以我们返回 5 。

提示:

1 <= num1 <= num2 <= 1022

1 <= min_sum <= max_sum <= 400

思路

我们编写一个函数,计算所有小于high且满足所有位的和小于max_sum的数的个数

将num1和num2分别带入这个函数,得到a和b,我们目前的答案就是 b - a;

注意,此时我们还没有处理num1,这个数,我们需要额外计算一下他是否满足好整数

对于计算出现次数的函数,我们的最终目的是构造一个满足大于等于min_sum且小于等于max_sum的数s,我们最终统计构造了多少次

我们申明三个参数:

  • i : 构造第i位
  • s:当前构造的数
  • is_limit: 是否受到前一位的制约

在递归过程中,当s大于max_sum时,说明这个s不可能被取到了,返回

当i递归到末尾,此时s满足好整数,则加1

我们判断下当前要填入的数的最大值有没有受前一位影响,如果被影响了,就只能填high[i],否则可以填0-9所有数,(eg:123,如果第一位我构造为0,则第二位只能填0,1,2,如果第一位构造为0,第二位可以填入0-9)

我们开始构造下一位数字

返回结果

复杂度

时间复杂度:

时间复杂度:O ( n m D ) O(nmD)O(nmD)

空间复杂度:

O ( m n ) O(mn)O(mn)

Code

class Solution:
    def count(self, num1: str, num2: str, min_sum: int, max_sum: int) -> int:
        def calc(high):
            @cache 
            def dfs(i,s,is_limit):
                if s>max_sum:
                    return 0
                if i==len(high):
                    return s >= min_sum
                
                res = 0
                up = int(high[i]) if is_limit else 9
                for d in range(up+1):
                    res += dfs(i+1,s+d,is_limit and d==up)
                return res
            return dfs(0,0,True)
        ans =( calc(num2) - calc(num1) ) % 1_000_000_007
        x = 0
        for i in range(len(num1)):
            x += int(num1[i])
        if min_sum<= x <= max_sum:
            ans+=1
        return ans


目录
相关文章
|
1月前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
5天前
leetcode代码记录(整数拆分
leetcode代码记录(整数拆分
9 0
|
19天前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
28天前
|
存储 算法
leetcode1237. 找出给定方程的正整数解
leetcode1237. 找出给定方程的正整数解
8 0
|
28天前
leetcode 2520 统计能整除数字的位数
leetcode 2520 统计能整除数字的位数
5 0
|
2月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
2月前
leetcode2376. 统计特殊整数
leetcode2376. 统计特殊整数
15 1
|
5天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
8 0
|
5天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
9 0