leetcode_50:Pow(x,n)

这个题目说实话刚开始感觉棘手,后来如果用心想发现没那么难,当然暴力法在此我们就不多接赘述了。

1. 递归法

就是将问题分解成小问题,也叫快速幂法,代码如下。一定要注意的就是对于n<0时的处理情况,将其变为n>0的情况进行处理

class Solution {
    public double myPow(double x, int n) {
        if(n == 0) return 1; //快速返回
        if (n < 0) {  //对于n<0的情况,都变为n>0的情况
            x = 1 / x;
            n = -n;
        }
        return fastPow(x, n);
    }
	//递归求值
    private double fastPow(double x, int n) {
        if (n == 1)  //当指数为1时,直接返回x,这样就没有考虑指数为0的情况
            return x;
        double half = fastPow(x, n/2);  //求一半
        return n%2==0 ? half*half : half*half*x;  //按照指数的奇偶返回对应的值
    }
}

当然我的这个解法有溢出情况存在,就是对于n=0的情况可能处理的不太好,但也是只有4个测试用例没有通过。因为我任务当n==1时返回更容易理解些。

2. 迭代法

有递归法就有迭代法,代码如下,参考leetcode官方题解。

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        if (N < 0) {
            x = 1 / x;
            N = -N;
        }
        double ans = 1;
        double current_product = x;
        for (long i = N; i > 0; i /= 2) {
            if ((i % 2) == 1) {  //如果是奇数,将当前的值乘到ans上,到最后肯定有i%2==1的时候,再将原来乘得的ans乘到当前的值上
                ans = ans * current_product;
            }
            current_product = current_product * current_product;
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值