【算法题解】37. Pow(x, n)

这是一道 「中等难度」 的题
https://leetcode.cn/problems/powx-n/

题目

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

示例 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/2^2 = 1/4 = 0.25

提示:

  • n 是一个整数
  • 要么 x 不为零,要么

题解

这道题的暴力解法就是一个简单的 for 循环,循环 n 次,时间复杂度为

double ans = 1;
for(int i = 0; i < n; i++){
    ans *= x;
}

暴力解法当然不是最优解,不做考虑。

本题可以使用分治的思路去递归,我们知道

所以要求得 ,我们只需要知道 即可。

同样的,要求得 ,我们只需要知道 即可。

以此类推,每次只需要求得其中的一半,就可以推导出结果,最终时间复杂度为

需要注意的点:

  1. 「边界条件 n == 0」时:直接返回 1
  2. 「n < 0」时:转换为 。这里还「需要特别注意的一点是当 时, 会越界」,所以需要特殊处理,我们让 ,这样再使用 n < 0 这个条件去处理,就不会越界了。
  3. 「n 为奇数」的时候:如 , 那么用上面的公式 变为 。计算的结果就会少乘了一个 x, 所以最后需要补乘一个 x

Java 代码实现

class Solution {
    public double myPow(double x, int n) {

        // 边界条件
        if(n == 0){
            return 1;
        }

        // 如果 n 是负数
        if(n < 0){
            if(n == -(1 << 31)){
                return myPow(x, n + 1) / x;
            }
            return myPow(1 / x, -n);
        }
         
        double temp =  myPow(x, n / 2);

        double ans = temp * temp;
        // 如果 n 是奇数
        if(n % 2 == 1){
            ans = ans * x;
        }

        return ans;
    }
}

Go 代码实现

func myPow(x float64, n int) float64 {
    // 边界条件
    if n == 0 {
        return 1
    }

    if n < 0 {
        if n == -(1 << 31) {
            return myPow(x, n + 1) / x
        }
        return myPow(1 / x, -n)
    }

    temp := myPow(x, n / 2)

    ans := temp * temp
    if n % 2 == 1 {
        ans = ans * x
    }

    return ans

}

复杂度分析

  • 时间复杂度:
  • 空间复杂度:


– End –




原文始发于微信公众号(i余数):【算法题解】37. Pow(x, n)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/193802.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!