Java C++题解leetcode902最大为N的数字组合数位DP

 更新时间:2022年10月19日 11:41:26   作者:AnjaVon  
这篇文章主要为大家介绍了Java C++题解leetcode902最大为N的数字组合数位DP,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

题目链接

阅读理解

思路:数位DP

Java

class Solution {
    public int atMostNGivenDigitSet(String[] digits, int n) {
        // 转存digits
        int[] nums = new int[digits.length];
        for (int i = 0; i < digits.length; i++)
            nums[i] = Integer.parseInt(digits[i]);
        // 转存n
        List<Integer> list = new ArrayList<>();
        while (n != 0) {
            list.add(n % 10);
            n /= 10;
        }
        int len = list.size(), m = nums.length, res = 0;
        // 目标数位数 = len
        for (int i = len - 1, p = 1; i >= 0; i--, p++) {
            int cur = list.get(i);
            int l = 0, r = m - 1;
            while (l < r) { // 二分找合适的digits[r]
                int mid = l + r + 1 >> 1;
                if (nums[mid] <= cur)
                    l = mid;
                else
                    r = mid - 1;
            }
            // 是否继续向后
            if (nums[r] > cur)
                break;
            else if (nums[r] == cur) {
                res += r * (int)Math.pow(m, (len - p));
                if (i == 0) // 构造至最后一位
                    res++; // 加上nums[r]做该位的可能
            }
            else if (nums[r] < cur) {
                res += (r + 1) * (int)Math.pow(m, (len - p));
                break;
            }
        }
        // 目标数位数 < len
        for (int i = len - 1; i > 0; i--)
            res += Math.pow(m, i);
        return res;
    }
}
  • 时间复杂度:O(log⁡n),由于二分最大范围是1∼91可忽略,所以整体复杂度仅与n的位数有关
  • 空间复杂度:O(C),转存给出数据

C++

class Solution {
public:
    int atMostNGivenDigitSet(vector<string>& digits, int n) {
        // 转存digits
        vector<int> nums;
        for (int i = 0; i < digits.size(); i++)
            nums.emplace_back(stoi(digits[i]));
        // 转存n
        vector<int> list;
        while (n != 0) {
            list.emplace_back(n % 10);
            n /= 10;
        }
        int len = list.size(), m = nums.size(), res = 0;
        // 目标数位数 = len
        for (int i = len - 1, p = 1; i >= 0; i--, p++) {
            int cur = list[i];
            int l = 0, r = m - 1;
            while (l < r) { // 二分找合适的digits[r]
                int mid = l + r + 1 >> 1;
                if (nums[mid] <= cur)
                    l = mid;
                else
                    r = mid - 1;
            }
            // 是否继续向后
            if (nums[r] > cur)
                break;
            else if (nums[r] == cur) {
                res += r * (int)pow(m, (len - p));
                if (i == 0) // 构造至最后一位
                    res++; // 加上nums[r]做该位的可能
            }
            else if (nums[r] < cur) {
                res += (r + 1) * (int)pow(m, (len - p));
                break;
            }
        }
        // 目标数位数 < len
        for (int i = len - 1; i > 0; i--)
            res += pow(m, i);
        return res;
    }
};
  • 时间复杂度:O(log⁡n),由于二分最大范围是1∼91可忽略,所以整体复杂度仅与n的位数有关
  • 空间复杂度:O(C),转存给出数据

总结

持续偷懒之不想写Rust,看到那一堆容器就知道肯定搞不出来来回借用克隆;

get了数位DP的方法,还是很简单的;

由本题其实可以推广到计算任意区间内的合法数字数量

因为容斥原理所以直接res in [l,r]=dp(r)−dp(l)

以上就是Java C++题解leetcode902最大为N的数字组合数位DP的详细内容,更多关于Java C++ 最大为N的数字组合数位DP的资料请关注脚本之家其它相关文章!

相关文章

  • 如何使用Java生成PDF文档详解

    如何使用Java生成PDF文档详解

    这篇文章主要给大家介绍了关于如何使用Java生成PDF文档的相关资料,PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点,需要的朋友可以参考下
    2023-07-07
  • Mac电脑安装多个JDK版本的详细图文教程

    Mac电脑安装多个JDK版本的详细图文教程

    目前使用的主流版本还是JDK 8,但偶尔会想体验下新版本(或者旧版本),如果能装多个版本的JDK,而且很方便的切换就好了,这篇文章主要给大家介绍了关于Mac电脑安装多个JDK版本的相关资料,需要的朋友可以参考下
    2024-03-03
  • Maven如何构建可执行的jar包(包含依赖jar包)

    Maven如何构建可执行的jar包(包含依赖jar包)

    这篇文章主要介绍了Maven如何构建可执行的jar包(包含依赖jar包) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 10分钟带你徒手写个Java线程池

    10分钟带你徒手写个Java线程池

    我们自己手动实现的线程池要比Java自身的线程池简单的多,我们去掉了各种复杂的处理方式,只保留了最核心的原理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • java使用FFmpeg合成视频和音频并获取视频中的音频等操作(实例代码详解)

    java使用FFmpeg合成视频和音频并获取视频中的音频等操作(实例代码详解)

    这篇文章主要介绍了java使用FFmpeg合成视频和音频并获取视频中的音频等操作,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • java书店系统毕业设计 总体设计(1)

    java书店系统毕业设计 总体设计(1)

    这篇文章主要介绍了java书店系统毕业设计,第一步系统总体设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • java过滤器中Filter的ChainFilter过滤链

    java过滤器中Filter的ChainFilter过滤链

    这篇文章主要介绍了java过滤器中Filter的ChainFilter过滤链,发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行。如果感兴趣可以来学习一下
    2020-07-07
  • @scope("prototype") @loadbalanced注解负载均衡失效问题

    @scope("prototype") @loadbalanced注解负载均衡失效问题

    这篇文章主要为大家介绍了@scope("prototype") @loadbalanced注解负载均衡失效问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring注解方式防止重复提交原理详解

    Spring注解方式防止重复提交原理详解

    这篇文章主要为大家详细介绍了Spring注解方式防止重复提交原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • JavaWeb如何实现统一查询接口(jfinal)

    JavaWeb如何实现统一查询接口(jfinal)

    这篇文章主要介绍了JavaWeb如何实现统一查询接口(jfinal),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06

最新评论