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

leetcode 264. 丑数 II

题目:

https://leetcode.cn/problems/ugly-number-ii/description/?envType=study-plan-v2&envId=selected-coding-interview

问题描述

LeetCode 264题要求找到第n个丑数。丑数是指只包含质因数2、3、5的正整数,且习惯上认为第一个丑数是1。例如:

  • 前10个丑数是:1, 2, 3, 4, 5, 6, 8, 9, 10, 12
  • 输入:n = 10,输出:12

解题思路

要生成第n个丑数,可以使用动态规划的方法:

  1. 初始化:第一个丑数为1,即dp[1] = 1
  2. 三指针法:维护三个指针p2p3p5,分别记录当前乘以2、3、5后能得到的最小丑数的位置。
  3. 状态转移:每个新丑数都是由之前的某个丑数乘以2、3或5得到的,选择三者中的最小值作为下一个丑数,并更新对应的指针。

代码实现

class Solution {
public:int nthUglyNumber(int n) {vector<int> dp(n + 1);dp[1] = 1; // 第一个丑数是1int p2 = 1, p3 = 1, p5 = 1; // 初始指针都指向第一个丑数for (int i = 2; i <= n; i++) {int num2 = dp[p2] * 2;int num3 = dp[p3] * 3;int num5 = dp[p5] * 5;dp[i] = min(min(num2, num3), num5); // 取三者中的最小值// 更新指针if (dp[i] == num2) p2++;if (dp[i] == num3) p3++;if (dp[i] == num5) p5++;}return dp[n];}
};

代码解释

  1. 动态规划数组dp[i]表示第i个丑数。
  2. 三指针
    • p2:指向前一个乘以2后可能成为下一个丑数的位置。
    • p3:指向前一个乘以3后可能成为下一个丑数的位置。
    • p5:指向前一个乘以5后可能成为下一个丑数的位置。
  3. 状态转移
    • 每次生成新丑数时,选择dp[p2]*2dp[p3]*3dp[p5]*5中的最小值。
    • 如果选中某个值,则将对应的指针向后移动一位,确保不会重复计算。

复杂度分析

  • 时间复杂度:O(n),只需遍历一次数组。
  • 空间复杂度:O(n),需要存储前n个丑数。

通过这种方法,可以高效地生成第n个丑数,避免了暴力枚举的低效性。

相关文章:

  • 微信小程序分包配置
  • 文件上传漏洞防御全攻略
  • ​ 【prompt】 “PUA” 的提示词是否好用 ?—“更好的驱动LLM能力”
  • 工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
  • 下面给出基于 ESP32-C3 AT 固件的完整方案,包括
  • 秘塔AI搜索:智能搜索,高效获取信息
  • AI书签管理工具开发全记录(十九):嵌入资源处理
  • 英语写作中“每一个”each individual、every individual、every single的用法
  • WEB3全栈开发——面试专业技能点P4数据库
  • uniapp 小程序 学习(一)
  • 【Fifty Project - D34】
  • 基于Flask,MySQL和MongoDB实现的在线阅读系统
  • WEB3全栈开发——面试专业技能点P6后端框架 / 微服务设计
  • DisplayPort 2.0协议介绍(2)
  • TJCTF 2025
  • 申请Let’s Encrypt 证书
  • 分布式增量爬虫实现方案
  • 【大模型:知识库管理】--Dify接入RAGFlow 知识库
  • Ray框架:分布式AI训练与调参实践
  • IP选择注意事项
  • 怎么弄网站/优化模型数学建模
  • 贵州网站备案局/国外免费网站服务器
  • 做亚马逊网站一般发什么快递公司/百度开户联系方式
  • 洛阳网站建设汉狮报价/云南网站建设百度
  • 营销网站的建设流程/沈阳seo关键词排名
  • 做网站用什么系统好/广州代运营公司有哪些