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

embedded/2024/10/21 11:53:23/
题干

2376. 统计特殊整数

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数

给你一个 整数 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 。

提示:

  • 1 <= n <= 2 * 109
题解 1 时间上过不了
public static int countSpecialNumbers(int n) {  int count = 0;  for (int i = 1; i <= n; i++) {  HashSet<Integer> set = new HashSet<>();  int tmp = i;  int c = 0;  while (tmp > 0) {  int i1 = tmp % 10;  set.add(i1);  c++;  tmp /= 10;  }  if (c != set.size()) {  count++;  }  }  return n - count;  }
题解 2

动态规划,有想过,但是实现失败了
还有考虑过数学技巧的,用公式硬凑,这个是死路


public static int countSpecialNumbers(int n) {  int[][] dp = new int[String.valueOf(n).length()][1 << 10];    // 这里初始化dp赋值-1  n的长度和2的10次方 记录数字1,2,3,4,5,6,7,8,9 是否有被使用过  for (int[] ints : dp) {  Arrays.fill(ints, -1);  }  return f(0, true, 0, false, String.valueOf(n), dp) - 1;  
}  public static int f(int index,        // 递归的位置  boolean isLimit,  // 最后有最高位的限制  int mask,         // 记录已经使用过的数字  boolean isNum,    // 是否开始组成数字  String n,         // 数字n  int[][] dp) {     // 记忆化搜索  if (index == n.length()) {  return 1;  }  if (dp[index][mask] != -1 && isNum & !isLimit) {  return dp[index][mask];  }  int res = 0;  if (!isNum) {  res += f(index + 1, false, mask, false, n, dp);  }  // 看是否受限制  int top = isLimit ? n.charAt(index) - '0' : 9; // 如果有限制,就取最高位,如果没有限制就取9  for (int i = isNum ? 0 : 1; i <= top; i++) {  // 当位数可以使用  if ((mask & (1 << i)) == 0) {  // 递归  res += f(index + 1,  isLimit && i == top,  // 如果本身有限制,这次又是取最高位,那么还是需要限制最高位  mask | (1 << i),             // 1进行左移i位 然后求与   比如00011 | 1<< 3 就是   00111                    true,                 // 如果isNum为false,那么i开始位是1    如果isNum为true  n,  dp);  }  }  if (isNum & !isLimit) {  dp[index][mask] = res;            // 只有是数字,并且没有限制的时候才进行记忆化  }  return res;  
}
总结

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


http://www.ppmy.cn/embedded/123317.html

相关文章

查找回收站里隐藏的文件

在Windows里&#xff0c;每个磁盘分区都有一个隐藏的回收站Recycle&#xff0c; 回收站里保存着用户删除的文件、图片、视频等数据&#xff0c;比如&#xff0c;C盘的回收站为C:\RECYCLE.BIN\&#xff0c;D盘的的回收站为D:\RECYCLE.BIN\&#xff0c;E盘的的回收站为E:\RECYCLE…

【中间件学习】Nginx快速入门(为了配置一个项目)

-----------------------------本文章借鉴遇见狂神说--------------------------- 一、一个产品出现瓶颈&#xff1f;&#xff1f; 在一个产品刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应该就够…

Python知识点:如何使用Multiprocessing进行并行任务管理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何在Python中使用Multiprocessing进行并行任务管理 在现代编程中&#xff0c;…

vue3 + Ant design vue formItem 无法使用嵌套的form表单校验

文章目录 前言一、背景在这里插入代码片二、操作步骤1.复现前的准备工作&#xff08;1&#xff09;vue版本和ant design vue 版本&#xff08;2&#xff09;任意页面的代码 2.解决问题3.自定义表单校验的代码 总结 前言 提示&#xff1a; 一、背景在这里插入代码片 背景&…

基于Node.js+Express+MySQL+VUE科研成果网站发布查看科研信息科研成果论文下载免费安装部署

目录 1.技术选型‌ ‌2.功能设计‌ ‌3.系统架构‌ ‌4.开发流程‌ 5.开发背景 6.开发目标 7.技术可行性 8.功能可行性 8.1功能图 8.2 界面设计 8.3 部分代码 构建一个基于Spring Boot、Java Web、J2EE、MySQL数据库以及Vue前后端分离的科研成果网站&#xff0c;可…

新高考的五大变化‌‌(AI生成)

新高考的五大变化‌‌1 考试科目和考试时间的变化 ‌考试科目‌&#xff1a; 改革前&#xff0c;考试科目为‌语文、‌数学&#xff08;文/理&#xff09;、‌外语、‌理科综合/文科综合。 改革后&#xff0c;实行“312”模式&#xff0c;即全国统考科目3门&#…

Pikachu-Sql Inject-搜索型注入

MySQL的搜索语句&#xff1a; select * from table where column like %text%&#xff1b; 如&#xff1a;使用引号闭合左边的引号&#xff0c; or 11 把所有数据查询出来&#xff1b; # 注释掉后面的 引号等&#xff1b; test or 11# 查询出结果&#xff1a; 注入的核心点…

DBT hook 实战教程

本文将介绍dbt中在模型和seed级别使用post-hook的几个具体示例。dbt中的Post-hooks是一个强大而简单的特性&#xff0c;它在构建模型之后(如果是pre-hook&#xff0c;甚至在此之前)执行SQL语句。这些语句实际上(几乎)可以是任何东西&#xff0c;从将表复制到另一个数据库/模式&…