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