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

[LeetCode] 50. Pow(x, n)

时间:2019-10-02 18:24:44      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:整数   相关   超时   solution   fast   res   快速幂   注意   需要   

传送门:[LeetCode] 50. Pow(x, n)

题目描述

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

说明:

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

示例 1:

输入: 2.00000, 10
输出: 1024.00000

示例 2:

输入: 2.10000, 3
输出: 9.26100

示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: \(2^{-2}\) = \(1/2^2\) = 1/4 = 0.25

分析与代码

  • 这题直接用循环暴力相乘,肯定谁都能想出来,但这道是中等题,就不会这么简单,暴力法是会超时的。当然,直接循环暴力相乘也要注意幂为负数的时候。
  • 题目分类在二分,很自然就想到了\(x^n = (x^{n/2})^2\)

解法一、暴力

  • 注意幂为负数的时候,这里是不管正负数,先算出来,最后在判断正负,负数就取倒数。
  • 也可以先作处理,把 x 赋值为 1/x,把 n 取反,这样就可以直接算。
  • 注意:int 的最小值取反后会超出 int 的表示范围,使用 long。

代码:

class Solution {
    public double myPow(double x, int n) {
        double result = 1;
        for (long i = 0; i < Math.abs(n); i++) {
            result *= x;
        }
        return n > 0 ? result : 1 / result;
    }
}

解法二、快速幂(递归)

  • 当 n 为偶数时,\(x^n = (x^{n/2})^2\),但当 n 为奇数时,会少乘了一次 x,即应为\(x^n = (x^{n/2})^2 * x\)
  • 奇怪,不转为 long 好像也能过,测试用例删除了幂为 int 的最小值?

代码:

class Solution {
    public double fastPow(double x, long n) {
        if (n == 0) {
            return 1;
        }
        double sqrt = fastPow(x, n / 2);
        if ((n & 1) == 0) {
            return sqrt * sqrt;
        } 
        return sqrt * sqrt * x;
    }

    public double myPow(double x, int n) {
        long num = n;
        if (n < 0) {
            x = 1 / x;
            num = -num;
        }
        return fastPow(x, num);
    }
}

解法三、快速幂(迭代)

  • 思路其实和递归一样,只是递归是拆分的方式,迭代是累积的方式。

代码:

class Solution {
    public double myPow(double x, int n) {
        double result = 1;
        double product = x;
        for (int i = n; i != 0; i /= 2) {
            if ((i & 1) != 0) {
                result *= product;
            }
            product *= product;
        }
        return n > 0 ? result : 1 / result;
    }
}

小结

这道题主要考查二分,幂运算的快速幂运算。

也需要注意 int 的最小值取反后会超出 int 范围的问题,与补码知识相关。


[LeetCode] 50. Pow(x, n)

标签:整数   相关   超时   solution   fast   res   快速幂   注意   需要   

原文地址:https://www.cnblogs.com/qiu_jiaqi/p/LeetCode_50.html

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