剑指offer - 数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。

输入:2.00000,3
输出:8.00000

算法思路

暴力法

可以直接使用暴力法

如果 exponent>0,那么答案为:baseexponent

如果 exponent<0,先取exponent的绝对值,求出 baseexponent,然后将结果取倒数,即 1 / baseexponent
或者可以先取exponent的绝对值,直接求出 (1/base)exponent
两者都一样

二分法

上述暴力法的时间复杂度为O(n),比O(n)更好的是O(logn)。所谓的二分就是求其中一半,比如 2100 = 250 * 250,即求出把求2100变成了求250,250也可以继续分解下去,250 = 225 * 225,以此类推……

exponent可以分奇数和偶数讨论

  • 当 exponent 为偶数时(这里的n就是exponent):
    xn = (x2)n/2
  • 当 exponent 为奇数时:
    xn = x * (x2)n/2,即多出一项x
    比如:27 = 2 * (22)7/2(不要忘了哦,7/2=3)

代码实现

暴力法

public class Solution {
    public double Power(double base, int exponent) {
        if(base==0) return 0;
        //取绝对值
        int e = exponent >0 ? exponent : -exponent;
        double res = 1.0d;
        for(int i=0;i<e;i++){
            res *= base;
        }
        return exponent > 0 ? res : 1/res;
  }
}

时间复杂度:O(n)

二分法(递归实现)

public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0) return 0;
        //取exponent的绝对值
        if(exponent < 0){
            base = 1/base;
            exponent = -exponent;
        }
        return q_power(base,exponent);
  }
    
    private double q_power(double b,int n){
        //递归结束条件
        if(n==0) return 1.0;
        double res = q_power(b,n/2);
        //如果n是偶数
        if(n%2==0){
            return res * res;
        }else{
        	//多一个 x
            return res * res * b;
        }
    }
}

时间复杂度:O(logn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值