https://leetcode-cn.com/problems/powx-n/
# -*- coding:utf-8 -*- class Solution(object): def myPow(self, x, n): """ :type x: float :type n: int :rtype: float """ if n == 0: return 1.0 n_negative = False if n < 0: n = -n n_negative = True flag = 1 times = 0 while 2 * flag <= n: flag = flag << 1 times += 1 # 尝试判断下一个和当前哪一个离n更近 n_is_nearly = True if flag * 2 - n < n - flag: n_is_nearly = False sum = x for i in range(times): sum *= sum if n_is_nearly: for i in range(n - flag): sum *= x else: sum *= sum for i in range(2 * flag - n): sum /= x return sum if n_negative is False else 1.0 / sum if __name__ == '__main__': x = 0.00001 n = 2147483647 print(Solution().myPow(x, n))
思路:这道题第一时间想的就是找一个最大的小于n的2的n次方数,就是比如2的10次方,我们先算10以内最小的2的n次方数,是8,这时我们需要计算3次sum*sum即可得到2的8次方,然后再乘2次即可。
但是有一个2147483647次方的数。。那我们只能判断2的n次方和2的n+1次方和平方数哪个离得远。然后根据情况选择乘除。
思考:
def myPow1(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
i = n
if i < 0: i = -i
res = 1
while i != 0:
if i % 2 != 0: res *= x
x *= x
i = i // 2
return res if n > 0 else 1 / res
有一个思路类似,但是空间复杂度相对较低的方法,也是类似的对半查找,如果是奇数就乘一下,偶数就折半。
0 条评论