动态规划 丑数(三指针 谁先创造谁先功德++)

文章讨论了一道编程题,涉及寻找第n个丑数的算法。使用动态规划方法,通过维护三个指针p2,p3,p5分别对应2,3,5的乘积,不断更新dp数组,避免重复计算,找到最小的丑数。在比较过程中,由于可能存在多个因子产生相同的丑数,因此采用了多个独立的if条件来处理这种情况。
摘要由CSDN通过智能技术生成

在这里插入图片描述

无语这是medium题目吗
先放暴力解法 反正超时 无法ac本题

2, 3, 5 这前 3 个丑数一定要乘以其它的丑数, 所得的结果才是新的丑数
合并过程中重复解的处理
nums2, nums3, nums5 中是存在重复的解的, 例如 nums2[2] == 32, nums3[1] == 23 都计算出了 6 这个结果, 所以在合并 3 个有序数组的过程中, 还需要跳过相同的结果, 这也就是为什么在比较的时候, 需要使用 3 个并列的 if… if… if… 而不是 if… else if… else 这种结构的原因。 当比较到元素 6 时, if (dp[i] == dp[p2] * 2)…if (dp[i] == dp[p3] * 3)… 可以同时指向 nums2, nums3 中 元素 6 的下一个元素。+

class Solution {
public:
    int nthUglyNumber(int n) {
        //动态规划
        vector<int> dp(n,0);//初始化dp数组n个元素全为0 
        dp[0]=1;
        int p2=0,p3=0,p5=0;
        for(int i=1;i<n;i++)//i从1开始,因为dp[0]=1,第一个丑数已经设置好为1 
        {
            dp[i]=min(min(dp[p2]*2,dp[p3]*3),dp[p5]*5);//找到新的丑数给dp[i]
            if(dp[i]==dp[p2]*2) p2++;//看看which one创造了上面那个丑数dp[i],which one 功德++
            //当然不排除有两个指针同时创造3* 2=2*3,so是多if结构,两个一起功德++
            if(dp[i]==dp[p3]*3) p3++;
            if(dp[i]==dp[p5]*5) p5++;
        }
        return dp[n-1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值