题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:
这个题看着很简单,但是我想了很久依旧没有很好的思路,归根结底,是因为我不知道如何同时控制x*2,x*3和x*5三个数的比较大小。直到看了题解才恍然大悟,既然不知道怎么压入x*2,x*3和x*5三个数的某一个,那么维护好三个队列即可,每次比较的时候都把三个队列的头进行比较,取最小的那个压入答案即可。这里要注意,三个队列中可能存在重复元素,这时就需要同时把重复元素删除,这个坑卡了我好久 。。
代码十分简洁。
代码如下:
class Solution {
public:
int GetUglyNumber_Solution(int index) {
vector<int> ans;
ans.push_back(1);
int p2 = 0;
int p3 = 0;
int p5 = 0;
int n2 = 0;
int n3 = 0;
int n5 = 0;
for (int i = 1; i < index; i++){
n2 = ans[p2] * 2;
n3 = ans[p3] * 3;
n5 = ans[p5] * 5;
ans.push_back(min(n2, min(n3, n5)));
if (ans[i] == n2) p2++;
if (ans[i] == n3) p3++;
if (ans[i] == n5) p5++;
}
return ans[index - 1];
}
};
算法内容还需要继续修炼。
本文探讨了一种高效求解第N个丑数的算法,丑数定义为只包含质因子2、3和5的数。通过维护三个队列分别存储当前丑数乘以2、3和5的结果,每次比较并选择最小值加入答案,避免了重复元素的困扰,实现了简洁且高效的解决方案。
751

被折叠的 条评论
为什么被折叠?



