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

news2024/9/21 0:30:41
  • 题目链接
  • 发布于LeetCode的题解

思路

最开始尝试枚举,然后不出意外TLE了,于是开始尝试排列组合。

解题过程

  1. 给定正整数 n ,设长度为 len ,从最高位到最低位的索引为 0~len-1

  2. 例如数字 65535,第 0~4 位分别为 6、5、5、3、5。用 a[0]~a[4] 表示。

  3. 我们要考虑从 1~65535 中所有的数有多少个特殊整数,可以把分成两部分

    • 1~9999

    • 10000~65535

  4. 其中对于 1~9999,我们又可以分为:

    • 1~9
    • 10~99
    • 100~999
    • 1000~9999
    1. 我们可以用 sum[i] 表示 i 位数(首位不为0)总共有多少个特殊整数,那么1~9999中的所有特殊数的个数就可以表示为: s u m [ 1 ] + s u m [ 2 ] + s u m [ 3 ] + s u m [ 4 ] sum[1]+sum[2]+sum[3]+sum[4] sum[1]+sum[2]+sum[3]+sum[4]
    2. 想要求出 sum[i],我们可以考虑从 0~9 这10个数字中选出 i 个不同的然后全排列,即 s u m [ i ] = A 10 i sum[i]=A_{10}^i sum[i]=A10i
  5. 对于10000~65535,我们可以分为:

    • 10000~59999
    • 60000~65535
  6. 其中,10000~59999 可以分为:10000~19999,……,50000~59999

    • 这里有 a[0]-1 个这种类型的区间,其中每个区间,可以看作10个数字中已经有一个被选了(放在最高位了),然后从剩下 9 个数字中选择不同的 len-1 个出来全排列,每一块的特殊数个数为 A 9 l e n − 1 A_9^{len-1} A9len1
  7. 最后是最为复杂的 60000~65535 这一部分。这里我引入两个标记——

    • 一个 flag 表示 n 的第 flag 位(0~len-1)第一次出现(从高位往低位看)重复的数字,那么前 flag 位固定后之后的计算就无效了。(举个例子,65535 的 flag=2,那么就不用再讨论 65500~65535 的所有数字了)如果 n 中不存在重复数字,我们就令 flag=len−1(循环边界)。

    • 第二个 f[11] 数组,f[i] 初始值为0,f[i]=1 表示数字 i 在 n 中出现了。我们特殊处理了 k=0 的最高位,然后从 k=1 枚举到flag位。

    • 枚举时第 k 位时,内循环 i:0~a[k]-1 这 a[k] 个数字。
      (注意这一位不能枚举到 a[k] !!!)

      a. 如果 f[i] == 1,那么第 k 位就不能取 i 这个数字,continue

      b. 否则,前面已经确定了 k+1 个数字,后面还剩 len-(k+1)=len-k-1 个位置待枚举,所以我们只能从 10-(k+1)=9-k 个数字中选择 len-k-1 个数字全排列

    1. C 9 − k l e n − k − 1 ∗ A l e n − k − 1 l e n − k − 1 = ( 9 − k ) ! ( 10 − l e n ) ! C_{9−k}^{len−k−1}∗A_{len−k−1}^{len−k−1}=\frac{(9−k)!}{(10−len)!} C9klenk1Alenk1lenk1=(10len)!(9k)!

    2. 最后记得令 f[a[k]]=1

    3. 如果 flag==len-1 ,此时有两种情况:

      1. 在最后一位出现重复;
      2. 没有重复。
      3. 所以我们特判一下:if(k==len-1 && !f[a[k]]) ans++;
      4. 因为最后一位必须枚举到 a[k](而前面的位不能枚举到 a[k])——思考为什么?

Tip:

可以先把简单的 0~99 部分直接输出:

if(n<=10) return n;
else if(n<=99) return n-n/11;

复杂度

  • 时间复杂度: O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( 1 ) O(1) O(1)

Code

class Solution {
public:
    int countSpecialNumbers(int n) {
        if(n<=10) return n;
        else if(n<=99) return n-n/11;
        int fact[11];
        bool f[11],af[11];
        int len,ans=0,flag=20;
        memset(f,0,sizeof(f));
        memset(af,0,sizeof(af));
        memset(fact,0,sizeof(fact));
        vector<int> a;
        fact[0]=1;
        for(int i=1;i<=10;++i) fact[i]=i*fact[i-1];
        for(int i=0;n>0;i++){
            a.push_back(n%10);
            n/=10;
        }
        len=a.size();
        reverse(a.begin(),a.end());
        for(int i=0;i<len;++i)
        {
            if(af[a[i]]){
                flag=i;
                break;
            }
            af[a[i]]=1;
        }
        
        flag=min(flag,len-1);

        for(int i=1;i<len;++i) ans+=9*fact[9]/fact[10-i];

        ans+=(a[0]-1)*fact[9]/fact[10-len];

        f[a[0]]=1;
        int k=1;
        while(k<=flag){
            for(int i=0;i<=a[k]-1;++i)
            {
                if(f[i]) continue;
                ans+=fact[9-k]/fact[10-len];
            }
            if(k==len-1 && !f[a[k]]) ans++;
            f[a[k]]=1;
            k++;
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端动画库大比拼:为何选择Velocity.js

前端动画库大比拼&#xff1a;为何选择Velocity.js 前言 在现代网页设计中&#xff0c;动画效果是提升用户体验的重要手段。 Velocity.js: 一个与 jQuery 动画 API 兼容的动画引擎&#xff0c;以其卓越的性能和丰富的功能&#xff0c;成为了开发者的好工具。 本文将详细介绍…

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…

【Qt笔记】QToolBox控件详解

目录 引言 一、QToolBox的基本功能 1.1 分页布局 1.2 可点击标签 1.3 图标支持 1.4 信号与槽 二、 QToolBox的属性设置 2.1 设置指定索引位置可用性 2.2 设置指定索引位置图标 2.3 设置标题 2.4 设置提示信息 2.5 获取信息 三、QToolBox的常用API 3.1 构造函数…

前端vue-单选按钮的实现

要把name“sex”和value"男" 和 要把name“sex”和value"女"写上&#xff0c;然后在各自的标签内部写上v-model绑定属性。data中定义v-model的绑定值&#xff0c;后面的值是默认选中的男或者女性。

Google Play金融类应用上了又被下,怎么搞定设备短信权限问题?

不久前谷歌对金融类产品应用更新了政策要求&#xff0c;即8月31日起新注册的开发者账号必须得注册为企业账号才可以上架金融类产品应用&#xff0c;这对原本就是用企业号的开发团队或公司没什么影响&#xff0c;但如果用的是个人号得做点准备了。 可以看出&#xff0c;谷歌对金…

剑灵服务端源码(c#版本+数据库+配套客户端+服务端)

剑灵服务端源码&#xff0c;喜欢的下载研究研究。谁技术牛B的话&#xff0c;能把最新版本的客户端接上&#xff0c;就好了。 剑灵服务端源码&#xff08;c#版本数据库配套客户端服务端&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】剑灵服务端源码…

利士策分享,自我和解:通往赚钱与内心富足的和谐之道

利士策分享&#xff0c;自我和解&#xff1a;通往赚钱与内心富足的和谐之道 在这个快节奏、高压力的时代&#xff0c;我们往往在追求物质财富的同时&#xff0c;忽略了内心世界的和谐与平衡。 赚钱&#xff0c;作为现代生活中不可或缺的一部分&#xff0c;它不仅仅是生存的手段…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…

C++第十一节课 new和delete

一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数&#xff08;new会自动调用构造函数&#xff1b;delete会调用析构函数&#xff09; class A { public:A(int a 0): _a(a){cout <&l…

systemd学习

传统init进程启动流程 kernel内核代码init/main.c&#xff0c;内核启动init进程过程&#xff1a; init进程是由内核启动的第一个&#xff08;也是唯一的一个&#xff09;用户进程&#xff08;进程id为1&#xff09;&#xff0c;它根据配置文件决定启动哪些程序&#xff0c;ini…

mybatisplus的多记录操作 批量删除和批量查询

1.批量查询 通过in查询 Testpublic void testBatchSelectByIds(){List<Integer> ids Arrays.asList(5,7);List<User> users userMapper.selectBatchIds(ids);log.info(users);} 2.批量删除 Testpublic void testBatchDelete(){List<Integer> ids Arrays…

LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142237871 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用&#xff08;SoftReference&#xff09;弱引用&#xff08;WeakReference&#xff09;考一考 虚引用&#xff08;PhantomReference&#xff09;总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定&#xff0c;主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block&#xff08;块&#xff09;&#xff1a;独立的功能性页面组件&#xff0c;可以是一个简单的按钮&#xff0c;一个复杂的导航条&…

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

功耗中30分钟下载场景对平均电流标准的影响评估

下载场景的测试数据: 测试结论:相同场景下,有应用下载安装跟没应用下载安装,平均电流相差90-140mA左右 查看数据:下载场景的平均增量电流 (227+279) / 2 - 136 = 117 mA 理论的量化数据影响 根据当前的测试数据:静置待机平均电流 136 mA,下载场景平均电流增量 117mA, …

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

电气自动化入门05:三相异步电动机的正反转点动控制电路

视频链接&#xff1a;3.2 电工知识&#xff1a;三相异步电动机的正反转点动控制电路_1_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.断路器及其选型 1.1断路器定义、分类、表示符号 1.2.断路器功能、…

Vision Transform—用于大规模图像分类的Transformers架构

VIT — 用于大规模图像识别的 Transformer 论文题目&#xff1a;AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码&#xff1a;https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer&#xff08;ViT&…