[剑指 Offer 16. 数值的整数次方] | 刷题打卡

123 阅读1分钟

今天我们来做一道LeetCode上的题目,原题链接:剑指 Offer 16. 数值的整数次方

题目描述

  • 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
  • 示例 1:
    输入:x = 2.00000, n = 10
    输出:1024.00000
  • 示例 2:
    输入:x = 2.10000, n = 3
    输出:9.26100
  • 示例 3:
    输入:x = 2.00000, n = -2
    输出:0.25000
    解释:2-2 = 1/22 = 1/4 = 0.25
  • 提示:
    -100.0 < x < 100.0
    -231 <= n <= 231-1
    -104 <= xn <= 104

思路分析

  • 边界处理:if n==0: return 1
  • 暴力法求解
    • if n < 0: return 1 / result
    • if n > 0: return result
  • 优化版本(递归)
    • 如果n < 0,最终结果为1/x^-n
    • 如果n为奇数,最终结果为x∗x^n−1
    • 如果n为偶数,最终结果为x^(2∗(n/2))

代码

# Python
class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        # 暴力法
        # result = 1
        # if n == 0: 
        #     return result
        # elif n < 0: 
        #     while n < 0:
        #         result *= x
        #         n += 1
        #     return 1 / result
        # else:
        #     while n > 0:
        #         result *= x
        #         n -= 1
        #     return result
        
        # 二分法递归
        if n == 0: 
            return 1
        elif n < 0: 
            return 1 / self.myPow(x, -n)
        elif n & 1:
            return x * self.myPow(x, n - 1)
        else:
            return self.myPow(x * x, n // 2)

总结

  • 指数的二分指数级别的性能优化

附录

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情