题目描述

引用内容
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。

简而言之就是输入浮点数base,整数n,求base的n次方
示例1:

输入:2.00000,3
返回:8

示例2:

输入:2.00000,-2
返回:0.25000
说明:2的-2次方等于1/4=0.25

解法一:

根据题意我们求base的n次方即是阶乘,这是最先想到的思路,示例1

 public double power(double base,int exponent) {
        double ret =1.0;
        for (int i=0; i<exponent; ++i){
            ret *= base;
        }
        return ret;
    }

但是若是我们输入负数的情况,则不满足题目给出的示例2,所以我们需要考虑负数的情况

 public double power(double base,int exponent) {
        if (exponent < 0) {
            base =1/base;
            exponent = -exponent; //转变成正数
        }
        double resutl =1.0;
        for (int i=0; i<exponent; ++i){
            resutl *= base;
        }
        return resutl;
    }

这种普通求阶乘的方式,就是n * n * n...
时间复杂度:O(n)
空间复杂度:O(1)

解法二:

我们观察这种相乘的过程,比如说我们输入base = 2,n=5 那么就是求2^5
图片说明
其实可以写成2^1 * 2^2 * 2^2,而且可以知道a^4 = a^2 * a^2
至此高次方的幂可以由低次方的幂相乘得来:5次方 = 2次方 * 2次方 * 本身
图片说明

    public double Power(double base,int exponent) {
        if(exponent == 1) {
            return base;
        }
        if(exponent > 1) {
            double result =power(base,exponent/2);
            //将拆分出去的结果相乘
            result = result * result;
            return result;
        }
        return 1.0;
    }

此时我们的高次幂的结果由低次幂相乘而来,但是还需要考虑负数和偶数的情况

public class Solution {
     public double Power(double base, int exponent) {
        if (exponent <0){
            base = 1 / base;
            exponent = -exponent;
        }

        if (exponent == 1) {
            return base;
        }

        if (exponent > 1) {
            double result =Power(base, exponent / 2);
            if ((exponent & 1) == 1) { // exp&1就是判断奇偶,=1为奇数,比%效率更高
                result = result * result * base;
            } else {
                //将拆分出去的结果相乘
                result = result * result;
            }
            return result;
        }
        return 1.0;
    }
}

时间复杂度:O(logn),因为每次减少了一半(n/2)
空间复杂度:O(logn),因为高次幂由低次幂相乘而来,所以需要记录每次相乘次数