Ugly Number II 丑数 II

本文介绍了一种高效算法,用于查找第N个仅由质因数2、3、5构成的丑数。通过维护三个指针分别跟踪乘以2、3、5的操作,避免了重复计算,并逐步构建起丑数序列。

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

编写一个程序,找出第 n 个丑数。

丑数就是只包含质因数 2, 3, 5 的正整数

示例:

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

说明:  

  1. 1 是丑数。
  2. n 不超过1690。

思路:这道题可以每个数都去验证然后逐个计算每个自然数,但是这样效率太低,注意到每个丑数都是2,3,5的连乘的结果,所以新的丑数一定是某个之前的丑数乘以2或3或5的结果,则我们通过3个变量来维持上次更新完2,3,5对应的结果(否则每次都从头来乘速度太慢),然后计算乘以2,3,5的最小的那个数,那么这个数就是新的丑数,以此来不断更新丑数。

参考代码:

    int nthUglyNumber(int n) {
	int *dp = new int[n];
	if (n == 1) {
		return 1;
	}
	dp[0] = 1;
	int i_2 = 0;    //记录乘以2的位置
	int i_3 = 0;    //记录乘以3的位置
	int i_5 = 0;    //记录乘以5的位置
	int index = 1;
	int res = 1;
	while (index < n) {
		while (dp[i_2] * 2 <= dp[index - 1]) {
			i_2++;
		}
		while (dp[i_3] * 3 <= dp[index - 1]) {
			i_3++;
		}
		while (dp[i_5] * 5 <= dp[index - 1]) {
			i_5++;
		}
		int min_ = min(min(dp[i_2]*2, dp[i_3] * 3), dp[i_5] * 5);
		dp[index] = min_;
		index++;
	}
	res = dp[index-1];
	delete[] dp;
	return res;        
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值