Leetcode2376. 统计特殊整数

DeepSeek LeetCode 2376.统计特殊整数 C实现 解法一/二:时间复杂度 O(len × 2^10 × 10),空间复杂度 O(len × 2^10)// 剩下 i-1 位从 0-9 中选 i-1 个不同数字(除去首位的数字)((mask >> d) & 1)) { // 数字 d 未使用。// 首位不能为0,有 9 种选择(1-9)// 计算排列数 P(n, k) = n! 阅读详情

Every day a Leetcode

题目来源:2376. 统计特殊整数

解法1:数位 DP

题解:数位 DP 通用模板,附题单(Python/Java/C++/Go)

代码:

/*
 * @lc app=leetcode.cn id=2376 lang=cpp
 *
 * [2376] 统计特殊整数
 */

// @lc code=start
class Solution
{
public:
    int countSpecialNumbers(int n)
    {
        string s = to_string(n);
        int len = s.length(), memo[len][1 << 10];
        memset(memo, -1, sizeof(memo)); // -1 表示没有计算过

        function<int(int, int, bool, bool)> dfs;
        // 返回从 i 开始填数字,前面填的数字集合是 mask,能构造出的特殊整数的数目
        // is_limit 表示前面填的数字是否都是 n 对应位上的,
        // 如果为 true,那么当前位至多为 s[i],否则至多为 9
        // is_num 表示前面是否填了数字(是否跳过),
        // 如果为 true,那么当前位可以从 0 开始,否则当前位可以跳过,或者从 1 开始填数字
        dfs = [&](int i, int mask, bool is_limit, bool is_num) -> int
        {
            if (i == len)
            {
                // 找到了一个合法数字
                return is_num;
            }
            if (!is_limit && is_num && memo[i][mask] != -1)
                return memo[i][mask];
            int res = 0;
            if (!is_num)
            {
                // 可以跳过当前数位
                res = dfs(i + 1, mask, false, false);
            }
            // 如果前面填的数字都和 n 的一样,那么这一位至多填数字 s[i](否则就超过 n 啦)
            int up = is_limit ? s[i] - '0' : 9;
            // 枚举要填入的数字 d
            for (int d = 1 - is_num; d <= up; d++)
                if ((mask >> d & 1) == 0)
                {
                    // d 不在 mask 中
                    res += dfs(i + 1, mask | (1 << d), is_limit && d == up, true);
                }
            if (!is_limit && is_num)
                memo[i][mask] = res; // 记忆化
            return res;
        };

        return dfs(0, 0, true, false);
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(mD2D),其中 m 为字符串 s = to_string(n) 的长度,即 O(log⁡n),D = 10。由于每个状态只会计算一次,因此动态规划的时间复杂度 = 状态个数 × times × 单个状态的计算时间。本题状态个数为 O(m2D),单个状态的计算时间为 O(D),因此时间复杂度为 O(mD2D)。

空间复杂度:O(m2D),其中 m 为字符串 s = to_string(n) 的长度,即 O(log⁡n),D = 10。

拓展题:1012. 至少有 1 位重复的数字

题目链接:1012. 至少有 1 位重复的数字

代码:

/*
 * @lc app=leetcode.cn id=1012 lang=cpp
 *
 * [1012] 至少有 1 位重复的数字
 */

// @lc code=start

// 数位 DP

class Solution
{
public:
    int numDupDigitsAtMostN(int n)
    {
        string s = to_string(n);
        int len = s.length(), memo[len][1 << 10];
        memset(memo, -1, sizeof(memo)); // -1 表示没有计算过

        function<int(int, int, bool, bool)> dfs;
        // 返回从 i 开始填数字,前面填的数字集合是 mask,能构造出的特殊整数的数目
        // is_limit 表示前面填的数字是否都是 n 对应位上的,
        // 如果为 true,那么当前位至多为 s[i],否则至多为 9
        // is_num 表示前面是否填了数字(是否跳过),
        // 如果为 true,那么当前位可以从 0 开始,否则当前位可以跳过,或者从 1 开始填数字
        dfs = [&](int i, int mask, bool is_limit, bool is_num) -> int
        {
            if (i == len)
            {
                // 找到了一个合法数字
                return is_num;
            }
            if (!is_limit && is_num && memo[i][mask] != -1)
                return memo[i][mask];
            int res = 0;
            if (!is_num)
            {
                // 可以跳过当前数位
                res = dfs(i + 1, mask, false, false);
            }
            // 如果前面填的数字都和 n 的一样,那么这一位至多填数字 s[i](否则就超过 n 啦)
            int up = is_limit ? s[i] - '0' : 9;
            // 枚举要填入的数字 d
            for (int d = 1 - is_num; d <= up; d++)
                if ((mask >> d & 1) == 0)
                {
                    // d 不在 mask 中
                    res += dfs(i + 1, mask | (1 << d), is_limit && d == up, true);
                }
            if (!is_limit && is_num)
                memo[i][mask] = res; // 记忆化
            return res;
        };

        return n - dfs(0, 0, true, false);
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(mD2D),其中 m 为字符串 s = to_string(n) 的长度,即 O(log⁡n),D = 10。由于每个状态只会计算一次,因此动态规划的时间复杂度 = 状态个数 × times × 单个状态的计算时间。本题状态个数为 O(m2D),单个状态的计算时间为 O(D),因此时间复杂度为 O(mD2D)。

空间复杂度:O(m2D),其中 m 为字符串 s = to_string(n) 的长度,即 O(log⁡n),D = 10。

DeepSeek LeetCode 2376.统计特殊整数 public int countSpecialNumbers(int n) 例如:123、20、5 都是特殊的,但 11、121 不是。if (((mask >> d) & 1) == 0) { // d 未使用过。· 时间复杂度:O(10 × 2^10 × 10) ≈ O(10240),非常快。// 如果还没开始填数,可以选择跳过当前位(继续前导零)· 空间复杂度:O(10 × 2^10) ≈ O(10240)· mask:已使用的数字集合(10 位二进制)· isNum:是否已经开始填数字(处理前导零)· 注意处理前导零(前导零不算使用数字 0)· pos:当前处理到第几位。 阅读详情

相关推荐

LeetCode刷题记录---数位DP算法

LeetCode刷题记录---数位DP算法

weixin_43646592的博客 923

数位DP,统计特殊整数

通过使用数字动态规划的方法,我们能够高效地计算出区间[1, n]内的特殊整数数量。关键在于合理地定义状态并使用记忆化技术避免重复计算。此方法不仅适用于本题,也适用于其他涉及数位限制和组合的计数问题。

m0_58809631的博客 965

【C++动态规划 数位dp】2376. 统计特殊整数|2120

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。 示例 1: 输入:n = 20 输出:19 解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。 示例 2: 输入:n = 5 输出:5 解释:1 到 5 所有整数都是特殊整数。 示例 3: 输入:n = 135 输出:110 解释:从 1 到 135 总共有 110 个整数是特殊整数。 不特殊的部分数字为:22 ,114

闻缺陷则喜何志丹 641

leetcode2376. 统计特殊整数

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。示例 1:输入:n = 20 输出:19 解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。 示例 2:输入:n = 5 输出:5 解释:1 到 5 所有整数都是特殊整数。 示例 3:输入:n = 135 输出:110 解释:从 1 到 135 总共有 110 个整数是特殊整数。 不特殊的部分数字为:22 ,114 和 131

qq_51118755的博客 872

直流无刷减速电机选型指南:从KV值到霍尔传感器,新手必看的5个关键参数

本文详细解析直流无刷减速电机选型的5个关键参数,包括KV值、转矩、电流与功率、减速比选择以及霍尔传感器配置。通过实战案例和避坑策略,帮助工程师精准匹配电机性能与负载需求,提升工业自动化设备的可靠性和效率。特别强调霍尔传感器在精准控制中的关键作用。

alice7model的博客 624

AI驱动全栈开发实战:基于Spec与Codex的规格驱动开发指南

1. 先搞清楚“AI重构前端全栈”到底在解决什么实际问题 最近很多人在聊“AI重构前端全栈”,听起来像是又一个营销概念。但如果你真的拆开看,它核心解决的是一个非常具体且痛苦的问题: 一个开发者,如何从零开始,系统性地、不跑偏地完成一个完整项目,并且保证代码质量和架构一致性。 传统开发流程里,产品经理出PRD,前后端开会对齐,前端画页面,后端写接口,测试再介入。这个过程沟通成本高,文档容易过时,新人上手慢。而“AI重构”的思路,是试图用一套 规范化的指令(Spec) 来驱动AI(比如Codex这类模型)生成代

weixin_30596023的博客 460

统计特殊整数

例如,$n = 20$ 输出:19 解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。第1行:1个整数,表示满足条件的答案。如果一个正整数每一个数位都是。之间特殊整数的数目。第1行:1个整数$n$

cqbzrjx的博客 300

camera QXXX架构

This article introduces the QCX camera architecture for Qualcomm’s latest automotive chips including SA8650. It elaborates the layered camera stack under QNX, HGY and HQX systems, covering client applications, stream manager, CamX components and hardware d

qq_39257814的博客 4546

2376. 统计特殊整数--(每日一难phase2--day4)

leetcode周赛 T4 数位dp

weixin_42051691的博客 1437

零基础入门simulink仿真--通信领域的调制解调技术:基于Simulink的PM信号调制与解调仿真建模示例

PM的基本原理是将基带信号(如语音或音乐信号)加载到高频载波信号的相位上。通过改变载波的瞬时相位,可以实现信息的传输。PM的优点包括抗噪声能力强、频谱利用率较高等,但其解调过程相对复杂。通过Simulink,我们可以通过模块化的建模方式实现PM信号的调制和解调过程,并观察信号在信道中的传输效果。通过本指南,我们介绍了如何基于Simulink搭建一个完整的PM信号调制与解调仿真模型,并进行仿真和性能评估。背景介绍:理解PM信号调制与解调的基本原理及其应用。所需工具和环境:列出进行PM仿真所需的工具和环境。

amy_mhd的博客 607

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 355

`算法题解` `LeetCode` 2376. 统计特殊整数

1

WChang的博客 278

2025_NIPS_Truthful Aggregation of LLMs with an Application to Online Advertising

大型语言模型(LLMs)生成内容的 revenue 变现是在线广告的下一个前沿领域。我们考虑这样一种场景:广告商旨在影响LLM的回复,而平台则寻求最大化广告商价值并确保用户满意度。核心挑战在于,广告商的偏好通常与用户偏好存在冲突,且广告商可能误报其偏好。为解决这一问题,我们提出MOSAIC——一种拍卖机制,它确保真实申报是广告商的占优策略,并使每个广告商的效用与其对社会福利的贡献保持一致。重要的是,该机制无需LLM微调或访问模型权重,且随着计算资源的增加,可证明收敛到最优微调LLM的输出。

c_cpp_csharp的专栏 82

力扣(leetcode)每日一题 2376 统计特殊整数 | 数位dp | 暴力递归+记忆化搜索

这个不好分析呀。想到了第一次做也憋不出暴力递归不清楚这个是不是数位dp,但是肯定可以归到暴力递归+记忆化搜索他需要两个参数来isNum,isLimit来分析,还要掌握位运算的技巧来判断数字是否使用过。

ganjiee0007的博客 920

【网络与爬虫 62】小程序爬虫终极攻略:微信支付宝小程序数据采集完全指南

本文深入解析微信和支付宝小程序的爬虫技术,从基础架构分析到高级逆向工程,涵盖WXML/AXML模板解析、API接口拦截、网络流量分析等核心技术。通过实战案例和代码示例,帮助开发者掌握小程序数据采集的完整技术栈。

熵数实验室 3421

【Bug已解决】Claude Desktop Cowork 报错 Workspace unavailable 解决方案

方案适用场景推荐指数确认虚拟机镜像下载完整性排查的第一步,最基础的前提检查⭐⭐⭐⭐⭐确认虚拟机平台功能已启用Windows 系统功能层面的必要条件⭐⭐⭐⭐⭐重启 CoworkVMService快速尝试恢复服务正常状态⭐⭐⭐⭐完全重启客户端排除临时性状态错乱⭐⭐⭐⭐降级使用文件工具临时替代方案,不阻塞当前工作⭐⭐⭐报错的本质是Cowork 功能依赖的虚拟机管理服务,在 Windows 应用包隔离机制下未能正确定位虚拟机文件的实际存放路径。

博客 6240

[LeetCode解题报告] 2376. 统计特殊整数

数位DP模板题

liuliangcan的博客 1210

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【力扣】2376. 统计特殊整数

【力扣】2376. 统计特殊整数

风信子的博客 999

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣 2376. 统计特殊整数

DFS + 记忆化搜索

csdn_muxin的博客 372

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

LeetCode2376 统计特殊整数 - 排列组合

一个 flag 表示 n 的第 flag 位(0~len-1)第一次出现(从高位往低位看)重复的数字,那么前 flag 位固定后之后的计算就无效了。(举个例子,65535 的 flag=2,那么就不用再讨论 65500~65535 的所有数字了)如果 n 中不存在重复数字,我们就令。第二个 f[11] 数组,f[i] 初始值为0,f[i]=1 表示数字 i 在 n 中出现了。我们特殊处理了 k=0 的最高位,然后从 k=1 枚举到flag位。例如数字 65535,第 0~4 位分别为 6、5、5、3、5。

Catalany的博客 888

数位dp,LeetCode 2376 统计特殊整数

数位dp如何递推求解?

EQUINOX1的博客 743

(nice!!!)LeetCode 2376. 统计特殊整数(动态规划、数位DP)

【代码】(nice!!!)LeetCode 2376. 统计特殊整数(动态规划、数位DP)

记录一些刷过的题并分享学习心得 1101

LeetCode 2376. 统计特殊整数

LeetCode 2376. 统计特殊整数。 数位DP(灵神模板)

qq_45925322的博客 383

【数位DP】leetcode2376. 统计特殊整数

数位DP

jqq125的博客 509

【数位Dp】LeetCode 2376. 统计特殊整数

数位Dp

王小平 547

力扣题解2376

整段代码结合了动态规划与哈希表的缓存机制,优雅地解决了问题:通过位掩码有效记录已使用的数字。通过记忆化搜索加速计算,避免重复递归。提供了高效的方式来计算区间 ([1, n]) 中所有特殊整数的数量,可以适用于较大的数字范围。这种方法的时间复杂度主要由位数 ( m ) 影响,且结合了组合的计算,通常在实际问题中能够高效运行。

无限大的博客 2050
上一篇: Leetcode 第 111 场双周赛题解
下一篇: Leetcode3014. 输入单词需要的最少按键次数 I
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值