479. 最大回文数乘积 : 枚举运用题

简介: 479. 最大回文数乘积 : 枚举运用题

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 479. 最大回文数乘积 ,难度为 困难


Tag : 「枚举」、「数学」


给定一个整数 nn ,返回 可表示为两个 nn 位整数乘积的 最大回文整数 。


因为答案可能非常大,所以返回它对 13371337 取余 。


示例 1:


输入:n = 2
输出:987
解释:99 x 91 = 9009, 9009 % 1337 = 987
复制代码


示例 2:


输入: n = 1
输出: 9
复制代码


提示:


  • 1 <= n <= 81<=n<=8


枚举 + 数学



对于数位为 nn 的两个数而言,其乘积的位数要么是 2 * n2n,要么是 2 * n - 12n1

当数位 n > 1n>1 时,我们总能在数位为 2 * n2n 中找到答案。


利用回文串的特性,我们只需枚举回文串的前半部分即可(后半部分唯一确定),我们只要在枚举前半部分时按照「从大到小」进行,即可确保找到的第一个合法值为最大数,对于一个数位为 nn 的最大数为 10^n - 110n1


具体的,当枚举到回文串的前半部分 ii 时,我们利用回文串特性构造出具实际的回文数值 numsnums,随后检查 numsnums 能否分解成数位为 nn 的数对 (a, b)(a,b),利用乘法具有交换律,我们只需要枚举数对中的较大数即可。


代码:


class Solution {
    public int largestPalindrome(int n) {
        if (n == 1) return 9;
        int max = (int) Math.pow(10, n) - 1;
        for (int i = max; i >= 0; i--) {
            long num = i, t = i;
            while (t != 0) {
                num = num * 10 + (t % 10);
                t /= 10;
            }
            for (long j = max; j * j >= num; j--) {
                if (num % j == 0) return (int)(num % 1337);
            }
        }
        return -1;
    }
}
复制代码


  • 时间复杂度:枚举回文串的前半部分复杂度为 O(10^n)O(10n);检查回文串能否被分解复杂度为 O(10^n)O(10n)。整体复杂度为 O(10^{2n})O(102n)
  • 空间复杂度:O(1)O(1)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.479 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
9月前
|
存储 Java Apache
Velocityd的使用
Apache Velocity 是一个高效的 Java 模板引擎,主要用于动态文本生成,如网页、邮件或配置文件。其核心概念包括模板(Template)、上下文(Context)和引擎(VelocityEngine)。模板包含静态内容与动态指令,通过上下文传入数据,由引擎解析生成最终输出。Velocity 语法简洁,支持变量、条件判断、循环等逻辑控制,适用于 Web 开发及后端渲染场景。在 Spring Boot 等框架中集成方便,但需注意路径配置、编码设置及兼容性问题。
643 1
|
API 开发工具 git
git常用的API以及每个的应用场景
【4月更文挑战第5天】Git是流行的分布式版本控制系统,用于代码管理,提供丰富的API。本文概述了Git常用API,如`git init`(初始化仓库)、`git add`(添加到暂存区)、`git commit`(提交)、`git remote add origin`(添加远程仓库)、`git pull`和`push`(同步远程仓库)、`git branch`(分支管理)以及`git checkout`(切换分支或恢复文件)。了解和熟练使用这些API能提升开发效率和代码质量,更多Git功能可参考官方文档。
906 0
|
机器学习/深度学习 分布式计算 数据挖掘
MaxCompute 应用场景实践
MaxCompute 应用场景实践
621 0
|
数据采集 数据可视化 数据挖掘
学生成绩分析项目——数据分析与可视化
学生成绩分析项目——数据分析与可视化
1322 0
|
Python
python学生管理系统-面向对象版
面向对象开发的一般方式、搭建框架代码、实现添加学生的功能、1. 使用 input 获取学生的信息2. 使用学生信息,创建学生对象3. 将学生对象添加的字典中、删除/修改/查询 学生1. 使用 input 输入学生学号2. 判断学生信息是否存在3. 存在进行操作、保存、读取读取文件,一行内容就是一个学生信息readlines 读取所有行[&#39;11,aa,18,m\n&#39;, &#39;22,bb,16,f\n&#39;]将列表中的每一项数据转换为对象Student(id, name, age, gender)&#39;11,aa,18,m
679 1
|
缓存 搜索推荐 网络安全
Google Hacking
Google Hacking,也称为Google Dorking,是一种利用Google搜索引擎和其高级搜索技术来查找安全漏洞、敏感信息或用于渗透测试的特定数据的技术。
471 11
|
Cloud Native jenkins Java
使用Jenkins实现持续集成与持续部署
【6月更文挑战第7天】本文介绍了如何使用Jenkins实现持续集成与持续部署,提高软件开发效率和质量。首先,解释了CI/CD的概念,持续集成通过自动化构建和测试减少错误,持续部署则自动将软件部署至生产环境。接着,详细阐述了Jenkins的安装配置、构建项目设置,以及如何通过代码提交触发构建、自动化测试和构建报告。此外,还讨论了Jenkins的持续部署功能,包括配置部署环境、自动化部署和回滚策略。最后,指出Jenkins在DevOps和云原生趋势中的重要角色。
|
安全 API 数据处理
Android 15革命来袭:64位时代的大门轰然开启,开发者和用户将何去何从?
【8月更文挑战第20天】随着性能提升,Android 15的重大更新引领64位时代,提供更大内存支持、更快执行速度及增强安全性。新版本淘汰32位应用,优化系统库,并改善内存管理。开发者需适应64位开发,面对应用体积增大等挑战,同时享受更高效能。此转变标志着移动应用开发步入新阶段,为用户带来更流畅安全的体验。
1275 0
|
芯片
组合逻辑电路之半加器
组合逻辑电路之半加器
858 0
组合逻辑电路之半加器
|
安全 Shell Linux
【Shell 命令集合 系统管理 】⭐Linux关机命令 halt命令 使用指南
【Shell 命令集合 系统管理 】⭐Linux关机命令 halt命令 使用指南
474 0
【Shell 命令集合 系统管理 】⭐Linux关机命令 halt命令 使用指南