返回

LeetCode5198.丑数 III:细拆步骤,巧寻丑数

前端







在计算机科学中,丑数是一个可以被 235 整除的正整数。例如,前 10 个丑数是 123456891012。丑数在许多算法中都有应用,例如查找最小公倍数和最大公约数。

**寻找第 n 个丑数** 

为了找到第 n 个丑数,我们可以使用以下步骤:

1. 创建一个数组 ugly,其中包含前 n 个丑数。
2. 初始化丑数数组丑[0] = 13. 设置三个指针 i2i3i5,分别指向丑数数组中下一个要乘以 235 的元素。
4. 找到下一个最小的丑数,即丑[i2]、丑[i3] 和丑[i5] 中的最小值。
5. 将找到的最小丑数添加到丑数数组中。
6. 将 i2i3i5 指针移动到下一个要乘以 235 的元素。
7. 重复步骤 46,直到丑数数组中包含 n 个丑数。

**分解问题** 

现在,让我们一步一步地分解这个问题。首先,我们需要创建一个数组丑,其中包含前 n 个丑数。我们可以通过以下方式做到这一点:

```python
def create_ugly_array(n):
  ugly = [1]
  while len(ugly) < n:
    next_ugly = min(ugly[i2] * 2, ugly[i3] * 3, ugly[i5] * 5)
    if next_ugly not in ugly:
      ugly.append(next_ugly)
  return ugly

接下来,我们需要设置三个指针 i2、i3 和 i5,分别指向丑数数组中下一个要乘以 2、3 和 5 的元素。我们可以通过以下方式做到这一点:

i2 = 0
i3 = 0
i5 = 0

然后,我们需要找到下一个最小的丑数,即丑[i2]、丑[i3] 和丑[i5] 中的最小值。我们可以通过以下方式做到这一点:

next_ugly = min(ugly[i2] * 2, ugly[i3] * 3, ugly[i5] * 5)

接下来,我们需要将找到的最小丑数添加到丑数数组中。我们可以通过以下方式做到这一点:

ugly.append(next_ugly)

最后,我们需要将 i2、i3 和 i5 指针移动到下一个要乘以 2、3 和 5 的元素。我们可以通过以下方式做到这一点:

if next_ugly == ugly[i2] * 2:
  i2 += 1
if next_ugly == ugly[i3] * 3:
  i3 += 1
if next_ugly == ugly[i5] * 5:
  i5 += 1

寻找边界条件

在解决这个问题时,我们需要考虑以下边界条件:

  • 如果 n 等于 1,那么第 n 个丑数就是 1。
  • 如果 n 大于 1,那么第 n 个丑数一定大于 1。
  • 第 n 个丑数一定是丑数数组中最大的丑数。

拼装组合

现在,我们可以将上述步骤组合起来,以找到第 n 个丑数。我们可以通过以下方式做到这一点:

def find_nth_ugly_number(n):
  ugly = create_ugly_array(n)
  return ugly[n - 1]

代码示例

以下是一个代码示例,演示了如何使用 find_nth_ugly_number 函数来查找第 n 个丑数:

n = 10
ugly = find_nth_ugly_number(n)
print(ugly)

输出结果:

12

总结

在本文中,我们讨论了如何设计一个程序来查找第 n 个丑数。我们一步一步地分解了问题,寻找了边界条件,最后拼装组合以找到丑数。我们还提供了一个代码示例,演示了如何使用 find_nth_ugly_number 函数来查找第 n 个丑数。