LintCode实践之丑数2

原题:设计一个算法,找出只含素因子235 的第 n 小的数。符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...我们可以认为1也是一个丑数。

样例:如果n = 9, 返回 10。

个人思路:

1作为一名标准的算法小白我的首先想法自然是最简单的暴力解法,[捂脸]。从0开始对每一个数字进行判断,如果是丑数的话则令计数器加一(判断方法参照LintCde编程实践之丑数)。每次都对计数器和n进行判断,看是否相等,若相等,则输出当前数字。

代码如下:

class Solution:
    """
    @param n: An integer
    @return: the nth prime number as description.
    """
    def nthUglyNumber(self, n):
        # write your code here
        a = 0
        for i in range(0,100000000):
            num = i
            while(1):
                if num == 1:
                    a = a + 1
                    break
                elif num == 0:
                    break
                elif num % 2 == 0:
                    num = num /2
                    continue
                elif num %3 == 0:
                    num = num / 3
                    continue
                elif num % 5 == 0:
                    num = num /5
                    continue
                else:
                    break
            if a == n:
                return i

毫无疑问的,这种方式超过了题目预设的时间限制,至于到底是什么时间,我还在看算法导论。。

2之后就是在网上查阅的资料了主要参考了下面的博客:

https://blog.youkuaiyun.com/lhanchao/article/details/52079323

所有的丑数都是2^a*3^b*5^c的形式,1是2^0*3^0*5^0,2是2^1*3^0*5^0,6是2^1*3^1*5^1, 我们设定一个数组来保存每一步形成的丑数,用a,b,c作为数组的index,选取2*ugly[a]、3*ugly[b]、5*ugly[c]中最小的数,将其作为新的丑数。

代码如下:

class Solution:
    """
    @param n: An integer
    @return: the nth prime number as description.
    """
    def nthUglyNumber(self, n):
        # write your code here
        a = 0
        b = 0
        c = 0
        ugly = [1] * n
        for i in range(1,n):
            minnum = min(ugly[a]*2,ugly[b]*3,ugly[c]*5)
            if minnum >= ugly[a]*2:
                a = a+1
            if minnum >= ugly[b]*3:
                b = b+1 
            if minnum >= ugly[c]*5:
                c = c+1 
            ugly[i] = minnum
        return ugly[n-1]

补充:限于自身水平,并没有完全理解取最小值这一步到底是什么骚操作,希望有人可以帮助解答。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值