【leetcode50】【Pow(x, n)幂函数】

leetcode 50 Pow(x, n)

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

示例:

输入: 2.00000, 10
输出: 1024.00000

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

解题思路:

暴力法:写个循环,循环n次乘以一个x,O(N)
分治法:把x的乘积一分为二,还要考虑n是奇数还是偶数,若是偶数,两边就是n/2,那么只需要计算 y = x n / 2 y = x^{n/2} y=xn/2,另一边也是同样的值。若是奇数,把中间的x拿去,计算两边,也是计算 y = x n / 2 y = x^{n/2} y=xn/2,整除n, r e s u l t = y ∗ y ∗ x result=y*y*x result=yyx;O(logN)
在这里插入图片描述

代码思路:

递归思路:非常简洁,看湿了. 要清楚,最后都会变成奇数,因为1%2是等于1的,就会进入奇数情况,然后再返回1. 有个难理解的地方,就是最后一行,x*x已经做了一次分治,然后进入下一层循环就是上面说的 y ∗ y y*y yy,偶数情况下,最后其实返回的就是 y ∗ y ∗ 1 y*y*1 yy1,可以带 2 4 2^4 24进去理解一下。
非递归思路:关键是判断n是x的多少次方,如果n的二进制位是等于1的话,那么需要乘以x,即奇数情况。

代码:

递归:

class Solution:
    def myPow(self, x: float, n: int) -> float:
        
        if not n:    #n=0,那么返回1
           return 1
        if n<0:   #负数情况
            return 1/self.myPow(x,-n)
        if n%2:   #奇数情况,有余数,即进入判断
            return x * self.myPow(x,n-1)   #1%2= 1
        return self.myPow(x*x,n/2)   #偶数情况,直接返回相乘结果

非递归写法:位运算

class Solution:
    def myPow(self, x: float, n: int) -> float:
        
        if n < 0:   #负数情况
            x = 1/x
            n=-n
        pow = 1
        while n:
            if n&1:  #如果二进制位为1,就是奇数&1等于1
                pow *=x
            x*=x   #乘积
            n >>=1   # n = n右移一位,即n=n/2
        return pow
复 杂 度 分 析 : \color{red}{复杂度分析:}

O(logN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值