边工作边刷题:70天一遍leetcode: day 60-2

Ugly Number I/II

要点:I/II之间其实没多大关联,II和Super Ugly Number一样。基本思路就是逐个计算下一个ugly number直到n,用三个指针point2, point3, point5记录前一个2,3,5的位置。如果已经刚刚相乘取得新数,移动到改指针下一个ugly number的数上等待继续2,3,5。所以所有中间结果都要保留。
错误点:注意每个数的指针不是移到最前端,而是下移一个数,所以要记录序列中的所有数

I这题实际和Power of Three类似,就是怎么找整除。暴力解直接在loop里除每个因子,也可以用Power of Three的方法找最大整因子数%num看是不是==0

class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        point2, point3, point5 = 0,0,0
        dp = [0]*n
        dp[0]=1
        for i in xrange(1, n):
            dp[i] = min(dp[point2]*2, dp[point3]*3, dp[point5]*5)
            #print next
            if dp[i]/2==dp[point2]:
                point2+=1
            if dp[i]/3==dp[point3]:
                point3+=1
            if dp[i]/5==dp[point5]:
                point5+=1
        
        return dp[n-1]
posted @ 2016-06-13 04:57  absolute100  阅读(74)  评论(0编辑  收藏  举报