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