leetcode 264. Ugly Number II

本文介绍了一种寻找第N个丑数的有效算法。丑数定义为仅包含2、3、5作为质因数的正整数。通过动态规划的方法,文章详细解释了如何维护一个丑数列表,并高效地生成下一个丑数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

264. Ugly Number II

 
QuestionEditorial Solution
  My Submissions
 
  • Total Accepted: 36259
  • Total Submissions: 122710
  • Difficulty: Medium

 

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note that 1 is typically treated as an ugly number.

Show Hint 

Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

 

Subscribe to see which companies asked this question

Hide Tags
  Dynamic Programming Heap Math
Show Similar Problems
 
 
题解转自:

题意: 
写一个程序去查找第n个丑数。丑数的定义是该数字只能有2,3,5这样的因子。1作为第一个丑数。 
思路: 
我们知道丑数是由某个丑数乘上2或者3或者5得来。而且初始化时第一个丑数是1。

  1. 我们将已经按顺序求得的丑数放在数组中,该数组初始化时就只有一个1。
  2. 接下来考虑将已经求得的数组中的某个元素乘上2或者3或者5得到下一个应该存入数组的丑数。
  3. 比如当前的丑数数组中最大的值是M,那么下一个丑数应该是比M大的丑数。挑一个丑数乘上2,挑一个丑数乘上3,挑一个丑数乘上5,这三个结果都需要大于M。所以乘上2的那个丑数需要大于M/2,而乘上3的那个丑数需要大于M/3,乘上5的那个丑数应该大于M/5。
  4. 我们使用一个数组保存2,3,5接下来乘的那个丑数的下标,使得结果都大于M。
  5. 这个丑数的下标什么时候用来更新呢?初始化时下标都为0,因为这个时候丑数数组中只有一个元素1。当将M加入到数组后,把2,3,5对应的下标各自往后移动,使得乘的结果大于M。 
    以上。 
 
 
 1 class Solution {
 2 public:
 3     int nthUglyNumber(int n) {
 4         vector<int> dp(n);
 5         int index_2 = 0, index_3 = 0, index_5 = 0;
 6         int val_2 = 2, val_3 = 3, val_5 = 5;
 7         int i = 1;
 8         dp[0] = 1;
 9         for(;i < n;i++){
10             int val = min(val_2, min(val_3, val_5) );
11             if(val == val_2) {dp[i] = val_2; index_2++; val_2 = dp[index_2] * 2;}
12             if(val == val_3) {dp[i] = val_3; index_3++; val_3 = dp[index_3] * 3;}
13             if(val == val_5) {dp[i] = val_5; index_5++; val_5 = dp[index_5] * 5;}
14         }
15         return dp[n - 1];
16     }
17 };

 

转载于:https://www.cnblogs.com/njczy2010/p/5708377.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值