264. 丑数 II

int nthUglyNumber(int n){
    int p2=1, p3=1, p5=1;
    int dp[n+1];
    dp[1] = 1;
    int num2, num3, num5;
    for(int i=2;i<=n;i++){
        num2 = dp[p2] * 2;
        num3 = dp[p3] * 3;
        num5 = dp[p5] * 5;
        dp[i] = fmin(fmin(num2,num3),num5);
        if(dp[i] == num2){
            p2++;
        }
        if(dp[i] == num3){
            p3++;
        }
        if(dp[i] == num5){
            p5++;
        }
    }
    return dp[n];
}

采用动态规划官方解法:
https://leetcode-cn.com/problems/ugly-number-ii/solution/chou-shu-ii-by-leetcode-solution-uoqd/

设dp[i]为第i个丑数,dp[1]=1,设置初值为1的三指针p2,p3,p5

dp[i]=min(dp[p2]*2,dp[p3]*3,dp[p5]*5);

如果最小值是dp[pi]*i,则pi++

具体过程如下:

p2p3p4dp[n]

1

11dp[2]=min(2,3,5)=2
211dp[3]=min(4,3,5)=3
221dp[4]=min(4,6,5)=4
321dp[5]=min(6,6,5)=5
322dp[6]=min(6,6,10)=6
432dp[7]=min(8,9,10)=8

可以看出,dp[pi]*i(i=2,3,5) 分别构成三个以2,3,5为因数的递增数列,每次选取其中较小的那个作为下一个丑数,然后将被选取的那列乘以i然后加入下一次运算。也就是相当于把三个递增数组合并成一个递增数组,以此保证选出的丑数实现单调递增

注意当dp[pi]*i中存在相等结果时,对应的pi都需要++,例如表中n=6的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值