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]
法二:别人代码 利用三指针
思路:由丑数的定义可知,丑数必然是由丑数乘以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)
ttt