leetcode刷题(57)——50. Pow(x, n)

一、题目描述

实现 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] 。

二、思路及代码实现

快速幂 + 递归

本题的方法被称为快速幂算法。指数 n 为负数的结果可以由 n 为正数时的结果求得,即 x − n = 1 x n x ^{-n} = \frac{1}{x ^ n} xn=xn1,因此我们只需要考虑 n 为自然数的情况。

我们用分治算法的思想,一般地,如果要计算 x n x ^ n xn, 我们可以先计算 y = x n 2 y = x ^ \frac{n}{2} y=x2n,再计算 y 2 y ^ 2 y2 就能得到结果。这样我们就能将大问题划为规模更小的问题去解决。

题目中 n 为整数,当 n 是奇数还是偶数的情况也有所不同。例如,计算 x 8 x ^ 8 x8 时,先计算出 y = x 4 y = x ^ 4 y=x4,再计算 y 2 y ^ 2 y2 即可;而计算 x 9 x ^ 9 x9 时,先计算出 y = x 4 y = x ^ 4 y=x4,再计算 y 2 × x y ^ 2 \times x y2×x 才能得到结果。由此,我们的算法实现为:

  • 要计算 x n x ^ n xn 时,先递归地计算出 y = x ⌊ n / 2 ⌋ y = x ^ {\lfloor n / 2 \rfloor} y=xn/2 ⌊ a ⌋ \lfloor a \rfloor a 表示向下取整);
  • 再根据计算的结果,如果 n 为偶数,则 x n = y 2 x ^ n = y ^ 2 xn=y2;如果 n 为奇数,则 x n = y 2 × x x ^ n = y ^ 2 \times x xn=y2×x
  • 递归结束条件:当 n = 0 时, x 0 = 1 x ^ 0 = 1 x0=1

参考代码:

class Solution {
    public double myPow(double x, int n) {
        long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, N);
    }

    public double quickMul(double x, long N){
        if(N == 0)
            return 1.0;
        double y = quickMul(x, N / 2);
        return N % 2 == 0 ? y * y : y * y * x;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值