码迷,mamicode.com
首页 > 其他好文 > 详细

50. Pow(x, n)

时间:2020-09-24 00:07:31      阅读:35      评论:0      收藏:0      [点我收藏+]

标签:说明   data-   com   网络   col   css   ref   处理   联系   

50. Pow(x, n)

实现 pow(xn) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [?231, 231 ? 1] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

题解:

首先观察输入输出:

当n为正数时,输出myPow(x, n)

当n为负数时,输出1/myPow(x, -n)

所以需要额外的一个函数来处理这种情况。

 

题本的数据量大小:

-100.0 < x < 100.0

n是32位的有符号数,如果使用暴力循环的方法,则一定会超时,代码如下:

class Solution:
    def myPow(self, x: float, n: int) -> float:

        def my_pow(x, n):
            
            res = 1.0
            for i in range(n):
                res = res * x
            
            return res
        
        return my_pow(x, n) if n >= 0 else 1.0 / my_pow(x, -n)

技术图片

 

 

 

因此,我们可以采用分治的思想,进行递归,不断得减小问题规模。

求xn,采用分治,将问题规模缩小一半,我们可以求出y = x[n//2]

  • 当x为偶数时,xn = y * y
  • 当n为奇数时,xn = y * y * x
  • 当规模减小到0时,我们得到x0 = 1

代码如下:

class Solution:
    def myPow(self, x: float, n: int) -> float:

        def my_pow(x, N):

            if N == 0:
                return 1.0
            else:
                y = my_pow(x, N // 2)
                return y * y if N % 2 == 0 else y * y * x
        
        return my_pow(x, n) if n >= 0 else 1 / my_pow(x, -n)

时间复杂度:O(logn),递归的层数

空间复杂度:O(logn),递归的层数(递归时调用的额外的栈空间)

 

50. Pow(x, n)

标签:说明   data-   com   网络   col   css   ref   处理   联系   

原文地址:https://www.cnblogs.com/canaan233/p/13717820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!