264丑数II

题目:编写一个程序,找出第 n 个丑数。丑数就是只包含质因数 2, 3, 5正整数

来源:https://leetcode-cn.com/problems/ugly-number-ii/solution/

法一:自己的超时代码

思路:从2开始由小到大遍历判断每一个数是否为丑数,由于到后面丑数越来越稀疏,导致非常费时间.

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        if n == 1:
            return 1
        ans = [1]
        k = 2
        while len(ans) < n:
            for j in [2,3,5]:
                # 如果除以2 3 5中的某个数可以除尽,则判断商是否在之前的数中
                # 如果在说明是丑数,否则不是
                if k % j == 0:
                    if int(k/j) in ans:
                        ans.append(k)
                        break
            k += 1
        return ans[-1]
View Code

法二:别人代码   利用三指针

思路:由丑数的定义可知,丑数必然是由丑数乘以2 3 5而得来,并且每个丑数分别乘以2 3 5后都会得到后面的一个丑数,由此想到分别用三个指针来记录分别乘2 3 5的丑数的位置,每次取最小值,并且如果这个最小值大于等于其中某个了,则将指针加1.dp[i] 表示第i个丑数,那么dp[i] = min(2 * dp[l_2], 3 * dp[l_3], 5 * dp[l_5])

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        dp = [0] * n
        dp[0] = 1
        l_2 = 0
        l_3 = 0
        l_5 = 0
        for i in range(1, n):
            # 每次求三个指针乘以2 3 5后的最小值
            dp[i] = min(2 * dp[l_2], 3 * dp[l_3], 5 * dp[l_5])
            # 这里非常巧妙,如果大于等于了,则将指针后移一位.
            if dp[i] >= 2 * dp[l_2]:
                l_2 += 1
            if dp[i] >= 3 * dp[l_3]:
                l_3 += 1
            if dp[i] >= 5 * dp[l_5]:
                l_5 += 1
        return dp[-1]
if __name__ == '__main__':
    duixiang = Solution()
    a = duixiang.nthUglyNumber(15)
    print(a)
View Code

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/12245095.html