leetcode 50:Pow(x,n)

题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。
示例:
1.输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
2. 输入:x = 2.10000, n = 3
输出:9.26100
3. 输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
思路:

  • 调用库函数
  • 暴力求解
  • 分治法 :分为n为偶数和不是偶数两种情况进行
    1)n为偶数:
    X^n = X^ (n/2) * X^ (n/2)
  1. n 为奇数:
    X^n = X^ (n/2) * X^ (n/2) * X
    注意这个问题需要考虑n可能为负数的情况。
class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if n == 0:
            return 1.0
        if n < 0:
            return 1.0 / self.myPow(x, -n)
        y = self.myPow(x, n//2)
        if n % 2 == 0:
            return y * y
        else:
            return y * y * x

时间复杂度:O(log n),即为递归的层数。
空间复杂度:O(log n),即为递归的层数。这是由于递归的函数调用会使用栈空间。
同样的思想,不用递归实现分治:
利用整数的二进制拆分,例如x^77, 77 = (1001101)_2,而
x ^ ( 2 ^ 6=64) · x ^ (2 ^ 3 = 8) · x ^(2 ^ 2=4) **·**x ^(2 ^ 0=1) = x ^ 77
可见就是二进制中的1的位,所以我们一直对x其平方,从右向左遍历二进制,如果为1,则原结果成现在的x,否则只对x进行平方的操作,这样最终就会得到想要的结果。

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if n < 0:
            x = 1/x  # 转化为(1/x)的 -n 次
            n = -n
        pow = 1.0
        while n != 0:
            if n % 2 == 1:
                pow *= x
            x *= x
            n //= 2
        return pow

时间复杂度:O(\log n)O(logn),即为对 nn 进行二进制拆分的时间复杂度。
空间复杂度:O(1)O(1)。

本题较为经典,是重点题型!

你可能感兴趣的:(LeetCode练习,leetcode,算法,c++)