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

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个丑数,避免了暴力枚举的低效性。

http://www.xdnf.cn/news/12980.html

相关文章:

  • Java高频面试之并发编程-25
  • 电路图识图基础知识-远程/本地启停电动机(二十一)
  • 小天互连IM系统接入DeepSeek,开启智能化沟通与协作的新时代
  • BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
  • 认识CMake并使用CMake构建自己的第一个项目
  • NoSQL 之 Redis集群
  • Qt+OPC开发笔记(二):OPC客户端介绍与读取和写入bool类型Demo
  • ETS5430:多通道高性能汽车以太网接口卡
  • c语言——字符函数
  • UI自动化测试:现状,效果和最佳实践
  • #Uniapp篇:chrome调试unapp适配
  • MySQL 安装与使用详解
  • 宇树科技,改名了!
  • 案例分享 | 新东方文旅小程序设计优化
  • 解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
  • AI病理诊断七剑下天山,医疗未来触手可及
  • JavaSec-其他漏洞
  • 安全领域新突破:可视化让隐患无处遁形
  • 树莓派超全系列教程文档--(60)树莓派摄像头操作命令及使用其二
  • LeetCode Hot100刷题——合并两个有序链表
  • 电商价格监控 精准控价的关键路径
  • 【7色560页】职场可视化逻辑图高级数据分析PPT模版
  • 与时间赛跑
  • 基于TurtleBot3在Gazebo地图实现机器人远程控制
  • 论文检测器
  • Java 中 `LinkedList` 的典型应用场景
  • 人工智能100问☞第43问:什么是提示工程(Prompt Engineering)?
  • Python爬虫实战:从零构建高性能分布式爬虫系统
  • 基于Java项目的Karate API测试
  • Centos 7 服务器部署多网站