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 原题链接和其他优选题解。

相关文章
|
3月前
|
存储 Java Apache
Velocityd的使用
Apache Velocity 是一个高效的 Java 模板引擎,主要用于动态文本生成,如网页、邮件或配置文件。其核心概念包括模板(Template)、上下文(Context)和引擎(VelocityEngine)。模板包含静态内容与动态指令,通过上下文传入数据,由引擎解析生成最终输出。Velocity 语法简洁,支持变量、条件判断、循环等逻辑控制,适用于 Web 开发及后端渲染场景。在 Spring Boot 等框架中集成方便,但需注意路径配置、编码设置及兼容性问题。
123 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功能可参考官方文档。
753 0
|
存储 Kubernetes 调度
了解pod和pod的生命周期-这一篇文章就够了
了解pod和pod的生命周期-这一篇文章就够了
了解pod和pod的生命周期-这一篇文章就够了
|
数据采集 数据可视化 数据挖掘
学生成绩分析项目——数据分析与可视化
学生成绩分析项目——数据分析与可视化
1115 0
|
Cloud Native jenkins Java
使用Jenkins实现持续集成与持续部署
【6月更文挑战第7天】本文介绍了如何使用Jenkins实现持续集成与持续部署,提高软件开发效率和质量。首先,解释了CI/CD的概念,持续集成通过自动化构建和测试减少错误,持续部署则自动将软件部署至生产环境。接着,详细阐述了Jenkins的安装配置、构建项目设置,以及如何通过代码提交触发构建、自动化测试和构建报告。此外,还讨论了Jenkins的持续部署功能,包括配置部署环境、自动化部署和回滚策略。最后,指出Jenkins在DevOps和云原生趋势中的重要角色。
|
开发框架 缓存 API
【Uniapp 专栏】通过 Uniapp 构建移动办公应用案例分享
【5月更文挑战第12天】使用Uniapp开发的移动办公应用案例展示了其在提升工作效率和协作上的强大能力。应用涵盖日程管理、任务分配、文件共享、即时通讯等功能,适应跨平台需求,节省开发成本。借助Uniapp的组件和API,打造用户友好的界面,同时确保数据安全和稳定性。优化的界面设计及移动设备适应性,即使在网络不稳定时也能保证基本功能使用。此案例证明Uniapp是构建高效移动办公应用的理想选择,为企业数字化转型赋能。
332 5
|
安全 Shell Linux
【Shell 命令集合 系统管理 】⭐Linux关机命令 halt命令 使用指南
【Shell 命令集合 系统管理 】⭐Linux关机命令 halt命令 使用指南
247 0
【Shell 命令集合 系统管理 】⭐Linux关机命令 halt命令 使用指南
LabVIEW使用一个停止按钮来停止所有循环
LabVIEW使用一个停止按钮来停止所有循环
342 0
|
监控 安全 算法
矢量数据库安全性:数据加密与访问控制
【4月更文挑战第30天】本文探讨了矢量数据库的安全性,聚焦数据加密和访问控制。数据加密,包括选择安全、高效的算法,字段级加密及传输加密,保护敏感信息。访问控制涉及用户认证、权限管理和审计监控,确保合法用户访问。安全性的提升需要持续投入,关注新技术和安全威胁,以适应不断变化的环境。
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】机器学习中的超参数调优技术
【4月更文挑战第30天】本文探讨了机器学习中超参数调优的重要性,介绍了网格搜索、随机搜索、贝叶斯优化和AutoML等调优方法,并提供了Python中使用`scikit-learn`进行网格搜索的示例。超参数的选择直接影响模型学习和泛化能力,而调优技术能帮助找到最佳组合,提升模型性能。随着AutoML的发展,自动化调参将成为更高效的选择。
336 0