码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 每日一题 50. Pow(x, n)

时间:2020-06-01 13:35:09      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:技术   size   否则   quic   solution   每日一题   位置   code   pre   

技术图片

递归法

思路:

在计算一个数x的n次幂时xn,我们可以先递归计算出x的n//2次幂y=xn//2,然后根据递归计算的结果,如果n是偶数,则结果为xn=y2,否则xn=y2*x。

例如:

X77 =  (X38)2 * X  =  ((X19)2)2 * X =  (((X9)2 *X)2)2 * X =  ((((X4)2 * X)2 *X)2)2 * X =   (((((X2)2)2 * X)2 *X)2)2 * X 

代码:

class Solution:
    def myPow(self, x: float, n: int) -> float:
        def quickMul(N):
            if N == 0:
                return 1.0
            y = quickMul(N // 2)
            return y * y if N % 2 == 0 else y * y * x
        
        return quickMul(n) if n >= 0 else 1.0 / quickMul(-n)

迭代法

思路:

从递归法中可以看出,在最终结果中,最初的X贡献了X64,第二个X贡献了X8,第三个贡献了X4,最后一个贡献了X1,将每个贡献值相乘即为最终结果X77。这里可以看出,64,8,4,1  分别对应77的二进制中的1的位置,即 (1001101)2  ,所以我们可以通过对77除2迭代,把每个贡献值相乘得到结果。

代码:

class Solution:
    def myPow(self, x: float, n: int) -> float:
        def quickMul(N):
            ans = 1.0
            x_contribute = x
            while N > 0:
                if N % 2 == 1:
                    ans *= x_contribute
                x_contribute *= x_contribute
                N //= 2
            return ans
        
        return quickMul(n) if n >= 0 else 1.0 / quickMul(-n)

 

leetcode 每日一题 50. Pow(x, n)

标签:技术   size   否则   quic   solution   每日一题   位置   code   pre   

原文地址:https://www.cnblogs.com/nilhxzcode/p/13024685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!