使用Go和Python解决leetcode50 Pow(x,n)问题

leetcode50. Pow(x, n)

使用快速幂+递归
  • 如果n < 0: 则取反 1/ mypow(x,-n)
  • 如果n为奇数:则一定能够提出来一个x,再次进行二分法
  • 如果n为偶数:则可以化为myPow(x*x, n//2)

使用递归实现Python版:

class Solution(object):
    def myPow(self, x, n):
        if n == 0:
            return 1
        if n < 0:
            return 1 / self.myPow(x,-n)
        if n % 2:
            return self.myPow(x,n-1)*x
        return self.myPow(x*x,n//2)

使用递归实现Golang版:

func myPow(x float64, n int) float64 {
    if n > 0 {
        return quickMul(x,n)
    }
    return 1.0/quickMul(x,-n)
}

func quickMul(x float64,n int) float64 {
    if n == 0 {
        return 1
    }
    y := quickMul(x, n/2)
    if n%2 == 0 { 
        return y*y
    }
    return y*y*x
}
使用快速幂+迭代

使用逆向思维,如果n为偶数时,pow(x,n) == pow(x*x, n/2)

当n/2为奇数时,pow(x*x,n/2) = pow((x*x)*(x*x),(x/2)-1)/2)* x*x

由此可见:我们不妨令一个x_value作为当前的pow(x,n)的底,逐步迭代,直到n = 0,循环结束。

迭代,Python实现:

class Solution:
    def myPow(self, x: float, n: int) -> float:
        res = 1
        tmp = n if n > 0 else -n 
        x_value =x
        while tmp > 0:
            if tmp % 2 == 1:    # 如果为奇数
                res =res * x_value
            x_value *= x_value 
            tmp = tmp // 2
        return res if n > 0 else 1.0/res

迭代,Golang实现:

func myPow(x float64, n int) float64 {
	if n > 0 {
		return quickMul(x,n)
	}
	return 1.0 / quickMul(x,-n)
}

func quickMul(x float64,n int) float64 {
	res:= 1.0
	x_value := x
	for n > 0 {
		if n%2 == 1 { // 奇数时
			res *= x_value
		}
		x_value *= x_value
        n/=2
	}
	return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值