丑数

方法一暴力:牛客网 超时 no accept
class Solution {
public:
	/*
	首先判断2,3,5是不是一个数的因子,即可以整除。
	然后判断这个数是不是2,3,5因子的组合,即一直整除2,3,5最后是不是为1 
	*/
	bool UglyNum(int n)
	{
		while (n % 2 == 0)
			n /= 2;
		while (n % 3 == 0)
			n /= 3;
		while (n %5  == 0)
			n /= 5;
		return n == 1 ? true : false;
	}
	int GetUglyNumber_Solution(int index) {
		int num = 0;
		if (index >= 1)
		{
			
			int UglyCount = 0;
			while (UglyCount < index)
			{
				num++;
				if (UglyNum(num))UglyCount++;
				
			}
			
		}
		return num;
	}
};
方法一DP:空间换时间 、牛客网 accept
  • 不像前面那样在非丑数上浪费时间,我们可以创建一个数组,里面存着已经排好序的丑数。每个丑数都是由前面的的丑数乘以2、3、5得到。
    动态规划的代码:
class Solution {
public:

	int GetUglyNumber_Solution(int index) {
		if (index < 1)return 0;
		int p1 = 0, p2 = 0, p3 = 0;
		int *Dp = new int[index];
		Dp[0] = 1;
		for (int i = 1; i < index; i++)
		{
			Dp[i] = min(min(Dp[p1] * 2, Dp[p2] * 3), Dp[p3] * 5);
			if (Dp[i] == Dp[p1]*2)p1++;
			if (Dp[i] == Dp[p2]*3)p2++;
			if (Dp[i] == Dp[p3]*5)p3++;
		}
		return Dp[index - 1];
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值