【5分钟力扣】50. 用python3实现Pow(x,n)幂次运算

文章目录

    • 一、前言
    • 二、题目
    • 三、题目考点
    • 四、暴力解法
      • 解法4.1思路
      • 4.2 代码实例
    • 五、分治思想,递归解法
      • 5.1 解法思路
      • 5.2 代码实例
    • 六 分治算法思想

一、前言

每天五分钟,看懂一道简单、中等难度的算法题,尽可能将复杂的题讲清楚。
疯狂学习python中,2020-05-31更新

【5分钟力扣】50. 用python3实现Pow(x,n)幂次运算_第1张图片

二、题目

实现 pow(x, n) ,即计算 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

三、题目考点

本题粗看,平平无奇,一个 return x** n 就能解决问题。但是从面试官角度考虑,它的出题点应该是:

1、优化程序运行速度,实现log(n)时间复杂度算法

2、能够考虑所有特殊测试数据。

参考博客:时间复杂度 O(log n) 意味着什么?

【5分钟力扣】50. 用python3实现Pow(x,n)幂次运算_第2张图片

四、暴力解法

解法4.1思路

Xn :本质上就是 N个X相乘,那么先处理特殊情况,然后直接循环N次,就能解决问题了?

4.2 代码实例

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if x == 0 and n < 0:  # 底数为0,幂为负数,程序会直接报错。
            return None
        if n == 0:
            return 1
        # 处理n 为负数情况    
        if n < 0:
            x = 1 / x
            n = -n
        res = float(1)
        for i in range(n):
            res *= x
        return res
if __name__ == '__main__':
    obj = Solution()
    print(obj.myPow(0, -1))

本解法时间复杂度是O(n),提交力扣出现 超出时间限制情况

【5分钟力扣】50. 用python3实现Pow(x,n)幂次运算_第3张图片

五、分治思想,递归解法

5.1 解法思路

如果我们要计算 365 ,可以使用分治思想,将其拆分成 3(32)*2 * 3,依次递归一步步分解到最小个体, 分解步骤:

3—32 —34 —316 —332 —364 —364*3 —365

也就是要计算Xn ,可以先递归出 y = X(n/2)

  • 如果n为偶数,那么 Xn = y2

  • 如果n为奇数,那么 Xn = y2 * X

  • 递归的边界n=0,任意数的0次方均为1

由于每次递归都会将算法复杂度减少一半,因此递归的层数为 O(log n),算法可以在很快的时间内得到结果。

5.2 代码实例

# 分治思想,递归解法
class Solution:
    def myPow(self, x: float, n: int) -> float:
        if x == 0 and n < 0:
            return
        def recursion(N):
            if N == 0:
                return 1.0
            y = recursion(N // 2)
            if N % 2 == 0:
                return y * y
            else:
                return y*y*x
        return recursion(n) if n >= 0 else 1/recursion(-n)

if __name__ == '__main__':
    obj = Solution()
    print(obj.myPow(3, 66))
    

【5分钟力扣】50. 用python3实现Pow(x,n)幂次运算_第4张图片

六 分治算法思想

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

【5分钟力扣】50. 用python3实现Pow(x,n)幂次运算_第5张图片

更多参考:分治算法详解

你可能感兴趣的:(分治算法,力扣50题,python幂次运算)