【LeetCode 中等题】26-Pow(x, n)

本文深入探讨了快速幂算法,提供了解决LeetCode中Pow(x, n)问题的两种方法:迭代和递归。通过实例展示了如何高效计算x的n次幂,尤其是在n为大整数时的表现。

声明:

今天是中等题第26道题。实现 pow(xn) ,即计算 x 的 n 次幂函数。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除

(手动比心ღ( ´・ᴗ・` ))

正文

题目:实现 pow(xn) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000

示例 2:

输入: 2.10000, 3
输出: 9.26100

示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:

  • -100.0 < x < 100.0
  • n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

解法1。如果是一个个乘x肯定超时,考虑让要乘的x指数型增长,因为n无非就是奇数或偶数两种情况,讨论如下:

  • n为奇数:res可以分解为x^{\sum 1+2+4+...+2^{i}}
  • n为偶数:res可以分解为x^{\sum 2+4+...+2^{i}}

所以用迭代的方式,每次判断n的奇偶,让x成倍地增大即可,代码如下。

执行用时: 52 ms, 在Pow(x, n)的Python3提交中击败了79.47% 的用户

class Solution:
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        sign = 1 if n > 0 else -1
        n = abs(n)
        res = 1.0
        while n != 0:
            if n % 2 != 0:
                res *= x 
            x *= x
            n //= 2
        return res if sign == 1 else 1/res

解法2。用递归的方式,确定好边界条件,分n为奇偶两种情况分开递归、返回即可,代码如下。

执行用时: 52 ms, 在Pow(x, n)的Python3提交中击败了79.47% 的用户 

class Solution:
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if n < 0:
            x,n = 1/x,-n    # n为负时要特别处理一下
        elif n == 0:
            return 1
        
        if n % 2 == 0:
            return self.myPow(x*x, n//2)
        else:
            return self.myPow(x*x, n//2) * x

结尾

解法1:http://www.cnblogs.com/grandyang/p/4383775.html

解法2:LeetCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值