zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Allegro转换PADS终极篇.....
    PNP与NPN三极管
    windows无法设置防火墙
    SourceInsight 不断无响应的有关问题
    看片/复制/下载技巧
    WinRAR 5.01 正式版 (简体中文)附注册机及注册码
    JVM 学习笔记 1. JVM 运行模型
    Core Java笔记 9.集合(I)
    Core Java笔记 8.泛型(II)
    Core Java笔记 7.泛型(I)
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12245095.html
Copyright © 2011-2022 走看看