• 50. Pow(x, n)


    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),递归的层数(递归时调用的额外的栈空间)

  • 相关阅读:
    【原创】驱动加载之OpenService
    【原创】驱动加载之CreateService
    【原创】驱动加载之OpenSCManager
    【原创】如何由结构体成员的地址逆算出结构体首地址
    【原创+整理】简述何为调用约定,函数导出名以及extern C
    【整理】WDK 和 DDK异同
    java IO流
    java StringBuffer与StringBuilder
    java集合——进度1
    javaweb——总结
  • 原文地址:https://www.cnblogs.com/canaan233/p/13717820.html
Copyright © 2020-2023  润新知