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

动态规划 丑数(三指针 谁先创造谁先功德++)_第1张图片

无语这是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];
    }
};

你可能感兴趣的:(动态规划,算法)