算法思想一:直接暴力法
解题思路:
将 exponent 分为正 负数,当为负数时将 exponent 转为正数,并采用循环计算 exponent 次幂,然后将结果转为其倒数
当为正数时,可直接采用循环计算 exponent 次幂
代码展示:
# -*- coding:utf-8 -*- class Solution: def Power(self, base, exponent): # write code here result = 1 # 如果base为0 if base == 0: return 0 # 如果exponent为0,则为0 if exponent == 0: return 1 # 如果exponent为负数,则将其转化为整数计算结果求倒数 if exponent < 0: for i in range(-exponent): result = result * base return 1/result # 循环计算exponent 次方 for i in range(exponent): result = result * base return result
复杂度分析:
时间复杂度O(N):循环计算只需要根据 exponent 的大小
空间复杂度O(1):需要常数级空间
算法思想二:递归
如果exponent == 0,返回1
如果exponent < 0,最终结果为 1 / x^{-n}
如果exponent为奇数,最终结果为 x * x ^ {n - 1}
如果exponent为偶数,最终结果为 x ^ {2*(n/2)}
如果exponent < 0,最终结果为 1 / x^{-n}
如果exponent为奇数,最终结果为 x * x ^ {n - 1}
如果exponent为偶数,最终结果为 x ^ {2*(n/2)}
代码展示:
public class Solution { public double Power(double base, int exponent) { //如果exponent等于0,直接返回1 if (exponent == 0) return 1; //如果exponent小于0,把它改为正数 if (exponent < 0) return Power(1 / base, -exponent); //根据exponent是奇数还是偶数来做不同的处理 递归 return (exponent % 2 == 0) ? Power(base * base, exponent / 2) : base * Power(base * base, exponent / 2); } }
复杂度分析:
时间复杂度:O(logn):其中n表示exponent
空间复杂度:O(logn)
算法思路三:位运算
算法思想:
循环遍历exponent的每一位
循环的过程中,让base做乘方运算
若当前最低位为1,则将res乘以当前base的值
最后若 exponent 为负数,则将结果转为倒数
代码展示:
class Solution { public double Power(double base, int exponent) { double res = 1.0; for (int i = exponent; i != 0; i /= 2) { if ((i&1) == 1) { res *= base; } base *= base; } if (exponent < 0) { res = 1 / res; } return res; } }
复杂度分析:
时间复杂度O(logN):N为exponent
空间复杂度O(1):常数空间