题目来源:剑指 Offer 16. 数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例2:
输入:x = 2.10000, n = 3
输出:9.26100
示例3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
方法一:失控的暴力循环,禁止!
# class Solution:
# def myPow(self, x: float, n: int) -> float:
# # 暴力循环 直接超出时间
# res = 1
# if n >= 0 :
# for i in range(n):
# res *= x
# else: # 负数次幂的时候,转化为(1/x)的(-n)次幂
# for i in range(-n):
# res *= 1/x
# return res
方法二:偷懒取巧的运算符,别闹了!
class Solution:
def myPow(self, x: float, n: int) -> float:
#实际上对python来说,为啥不直接
return x**n
方法三:一些正儿八经的方法
----分析来源
- 首先考虑正负数的问题,可以把n<0的情况转化为n>0的范围内;
- 根据二分推导,可通过循环 x = x2 操作,每次把幂从 n 降至 n/2 ,直至将幂降为 0 ;
- 设 res=1 ,则初始状态 xn = xn * res, 在循环二分时,每当 n 为奇数时,将多出的一项 x 乘入 res ,则最终可化至 xn = x0 * res = res,返回 res 即可。
- 时间复杂度 O(log2 n) ; 空间复杂度 O(1)。
class Solution:
def myPow(self, x: float, n: int) -> float:
# 利用了一些二进制的思想
if x == 0:
return 0
res = 1
if n < 0: # 把问题转化至 n≥0 的范围内
x, n = 1 / x, -n
while n:
if n%2 != 0:
res *= x
x *= x
n = n//2 #向下取整了
return res
胡言乱语一句:不出意外的停更了两天😭,好吧,人总是突如其来的high,也突如其来的丧。