当前位置: 首页 > article >正文

Leetcode 3272. Find the Count of Good Integers

  • Leetcode 3272. Find the Count of Good Integers
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3272. Find the Count of Good Integers

1. 解题思路

这一题我思路上是比较暴力的,就是典型地分步骤执行:

  1. 找出所有的可能构成回文的长度为n的字符组合
  2. 对于任意字符组合,判断其是否可以构成一个被k整除的回文序列
  3. 考察这个字符组合可以构成的非零开头的数字个数

其中,对于第一步,我们可以采用一个动态规划的方式进行实现,分别考察从0到9各自取用多少个元素,使之满足总长度为n,且至多只有一个元素的个数为奇数个。

然后,对于第二个,我们倒是没有什么太好的办法,只能暴力地遍历所有可能的回文,判断其是否存在某个元素满足能够被k整除。不过我们倒是可以稍微做一些简化:

  1. 如果总长度为1,那么只需要判断一下这个元素是否能被k整除即可
  2. 如果非零元素的个数至多只有1个,且要求总长度不小于2,那么可以直接干掉
  3. 如果 k = 3 k=3 k=3或者 k = 9 k=9 k=9,那么只需要判断所有元素的和是否能被 k k k整除即可
  4. 如果 k = 5 k=5 k=5,那么只需要判断是否存在至少两个 5 5 5即可。

而最后,对于第三步,这就是一个简单的排列组合的题目,字符总长为 n n n,假设任意数字 i i i的数目为 n i n_i ni,那么能够组成的所有非零开头的数字个数即为:
N = ( n − n 0 ) × ( n − 1 ) ! Π i = 0 9 n i ! N = \frac{(n-n_0) \times (n-1)!}{\mathop{\Pi}\limits_{i=0}^{9} n_i!} N=i=0Π9ni!(nn0)×(n1)!

2. 代码实现

我们给出最终的python代码实现如下:

@lru_cache(None)
def is_valid(sub):
    if sub == "":
        return True
    cnt = Counter(sub)
    s = [v%2 for v in cnt.values()]
    return sum(s) <= 1

@lru_cache(None)
def dp(idx, remain):
    if remain == 0:
        return [""]
    elif idx == 9:
        return ["9" * remain]
    ans = []
    for i in range(remain+1):
        subs = [str(idx) * i + sub for sub in dp(idx+1, remain-i)]
        subs = [sub for sub in subs if is_valid(sub)]
        ans += subs
    return ans

@lru_cache(None)
def is_possible_devide_by_k(sub, k):
    if len(sub) == 1:
        return int(sub) % k == 0 and sub != "0"
    if Counter(sub)["0"] >= len(sub)-1:
        return False
    if k == 1:
        return True
    if k == 3 or k == 9:
        return sum(int(ch) for ch in sub) % k == 0
    if k == 5:
        return Counter(sub)["5"] > 1
    cnt = Counter(sub)
    pair = "".join(ch * (v//2) for ch, v in cnt.items())
    unique = [ch for ch, v in cnt.items() if v % 2 == 1]
    unique = unique[0] if len(unique) > 0 else ""
    return any(int("".join(sub) + unique + "".join(sub[::-1])) % k == 0 for sub in permutations(pair) if not ("".join(sub) + unique + "".join(sub[::-1])).startswith("0"))

@lru_cache(None)
def count_fn(sub, k):
    ans = 0
    if is_possible_devide_by_k(sub, k):
        n = len(sub)
        cnt = Counter(sub)
        c = (n-cnt["0"]) * math.factorial(n-1)
        for v in cnt.values():
            c = c // math.factorial(v)
        ans += c
    return ans
    

class Solution:
    def countGoodIntegers(self, n: int, k: int) -> int:
        all_possible_substrings = dp(0, n)
        return sum(count_fn(sub, k) for sub in all_possible_substrings) 

提交代码评测得到:耗时1356ms,占用内存46.9MB。


http://www.kler.cn/a/286241.html

相关文章:

  • 扩展无限可能:Obsidian Web Viewer插件解析
  • 玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱
  • 基于排队理论的物联网发布/订阅通信系统建模与优化
  • Python从0到100(八十六):神经网络-ShuffleNet通道混合轻量级网络的深入介绍
  • socket实现HTTP请求,参考HttpURLConnection源码解析
  • 10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计
  • RabbitMQ 是什么?应用场景有哪些?
  • IBM Speech to Text:发出语音识别请求
  • Qt 实现应用程序换肤功能
  • ASP.NET Core 入门教程二 实现基本 GET 和 POST 接口
  • 【论文解读】SAM模型超级进化:面向移动端的轻量级SAM,比FastSAM快4倍!(附论文地址)
  • 【攻略】第三届数据库大赛创新上云性能挑战赛-高性能分析型查询引擎赛道-冠军
  • OpenCV绘图函数(5)绘制标记函数drawMarker()的使用
  • C++避坑小知识
  • 短视频流量|基于SprinBoot+vue的短视频流量数据分析系统(源码+数据库+文档)
  • 【华三】不懂链路聚合?看这篇就够了!华三配置详解
  • 公众号里的产品宣传册是如何制作的?
  • 2024HarmonyOS应用开发者高级认证最新整理题库和答案(已收录182道 )
  • 【Qt的TS文件转换器】利用Python实现自动化TS文件转换
  • 疲劳驾驶行为检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • DNS部署与安全
  • 花店鲜花管理与推荐系统+Python+Django网页界面+管理系统+计算机课设
  • PHP:构建高效Web应用的强大语言
  • ECMAScript和JavaScript区别
  • OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用
  • Linux中安装Docker环境