方案一:最小堆。
    方案二:三指针法。

    1. # 编写一个程序,找出第 n 个丑数。
    2. #
    3. # 丑数就是质因数只包含 2, 3, 5 的正整数。
    4. #
    5. # 示例:
    6. #
    7. # 输入: n = 10
    8. # 输出: 12
    9. # 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
    10. #
    11. # 说明:
    12. #
    13. #
    14. # 1 是丑数。
    15. # n 不超过1690。
    16. #
    17. # Related Topics 堆 数学 动态规划
    18. # 👍 361 👎 0
    19. from heapq import *
    20. # leetcode submit region begin(Prohibit modification and deletion)
    21. class Solution(object):
    22. def nthUglyNumber(self, n):
    23. """
    24. :type n: int
    25. :rtype: int
    26. """
    27. num = [1]
    28. p2 = p3 = p5 = 0
    29. while len(num) < n:
    30. ugly = min(num[p2] * 2, num[p3] * 3, num[p5] * 5)
    31. num.append(ugly)
    32. if ugly == num[p2] * 2:
    33. p2 += 1
    34. if ugly == num[p3] * 3:
    35. p3 += 1
    36. if ugly == num[p5] * 5:
    37. p5 += 1
    38. return num[n - 1]
    39. # leetcode submit region end(Prohibit modification and deletion)
    40. s = Solution()
    41. print(s.nthUglyNumber(10))