返回

程序员必备:掌握Pow(x, n)问题的多种解法(暴力+快速幂算法)

前端

大家好,欢迎来到 LeetCode面试刷题一题多解系列的第九篇。今天,我们将重点讨论Pow(x, n)问题,并介绍两种解法:暴力解法和快速幂算法。

首先,我们先明确一下问题:

题目: Pow(x, n)

给定一个实数x和一个整数n,求x的n次方。

示例:

Pow(2, 10) = 1024
Pow(2.1, 3) = 9.261
Pow(0.5, -2) = 4

限制:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • -104 < x^n < 104

思路:

我们可以使用两种方法来解决这个问题:暴力解法和快速幂算法。

暴力解法

暴力解法就是直接计算x的n次方。可以使用循环来实现,每次将x乘以自身即可。这种方法简单易懂,但是时间复杂度是O(n)。

def pow_naive(x, n):
  """
  暴力解法计算x的n次方。

  Args:
    x: 一个实数。
    n: 一个整数。

  Returns:
    x的n次方。
  """

  if n == 0:
    return 1
  elif n < 0:
    return 1 / pow_naive(x, -n)
  else:
    result = 1
    for _ in range(n):
      result *= x
    return result

快速幂算法

快速幂算法是一种更高效的算法,它的时间复杂度是O(log n)。该算法利用了这样一个事实:x的n次方可以表示为x^(n/2) * x^(n/2),如果n是偶数的话,或者x^(n/2) * x^(n/2) * x,如果n是奇数的话。

def pow_fast(x, n):
  """
  快速幂算法计算x的n次方。

  Args:
    x: 一个实数。
    n: 一个整数。

  Returns:
    x的n次方。
  """

  if n == 0:
    return 1
  elif n < 0:
    return 1 / pow_fast(x, -n)
  elif n % 2 == 0:
    half_power = pow_fast(x, n // 2)
    return half_power * half_power
  else:
    half_power = pow_fast(x, n // 2)
    return half_power * half_power * x

比较

下表比较了暴力解法和快速幂算法的时间复杂度:

算法 时间复杂度
暴力解法 O(n)
快速幂算法 O(log n)

如您所见,快速幂算法明显优于暴力解法。

总结

在本文中,我们介绍了Pow(x, n)问题的两种解法:暴力解法和快速幂算法。我们还比较了这两种算法的时间复杂度。快速幂算法显然更有效,因此我们推荐您使用快速幂算法来解决这个问题。