您的位置:首页 > 其它

leetcode 264: Ugly Number II

2016-08-09 10:54 260 查看
Write a program to find the
n
-th ugly number.

Ugly numbers are positive numbers whose prime factors only include
2, 3, 5
. For example,
1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first
10
ugly numbers.

Note that
1
is typically treated as an ugly number.

思路:

实际是一个分配2还是3还是5的问题;

求ans[i]时,遍历ans[i-1]至ans[1],

循环ans[j]*2,直到找到大于ans[i-1]且最小的值,

然后从当前位置开始,循环ans[k]*3,找最小值,

然后从当前位置同样处理ans[m]*5;

最后对三者求最小值,作为ans[i]。

注意:

用long long。

class Solution {
public:
int nthUglyNumber(int n) {
vector<long long> ans(n+1,1);
for(int i=2;i<=n;i++)
{
int j=i-1;
long long tmp;
for(;j>=1;j--)
{
if(ans[j]*2>ans[i-1])
tmp = ans[j]*2;
else
break;
}
long long tmp2 = tmp;
for(;j>=1;j--)
{
if(ans[j]*3>ans[i-1])
tmp2 = ans[j]*3;
else
break;
}
long long tmp3 = tmp;
for(;j>=1;j--)
{
if(ans[j]*5>ans[i-1])
tmp3 = ans[j]*5;
else
break;
}
ans[i] = min(min(tmp,tmp2),tmp3);
}

//for(int i=1;i<=n;i++)
//    cout<<ans[i]<<" ";
return ans
;
}
};


View Code
------------------------更新--------------------------

发现一个更好的算法:见:http://blog.csdn.net/ironyoung/article/details/49045933

相比于我上面的算法,不必从i-1到0一个一个去试2、3、5,

而是记录一下2、3、5下次开始考虑的起始位置,

以3为例,当前乘以3是最小值,下次就不会是在该位置再乘以3,而应往后考虑;

至于重复值,则过滤;

复杂度O(N*K)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: