leetcode:50.Pow(x, n)

简介: 实现 pow(x, n),即计算 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/2^2 = 1/4 = 0.25


说明:


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


题目难度:中等


分析:


如果直接调用API的话:return Math.pow(x, n)即可。


计算 x的 n次幂函数也就是计算 n个 x相乘。但是如果直接用for循环计算的话,当 n特别大的时候就会超出时间限制,显然不能这么去计算。但是可以用分治算法的思想把时间复杂度从 O(n) 缩短到 O(log 2 n) 。简单点来说就是两两相乘,把 n个x分成两部分,比如n为8时,前4后4,那么就变成了x 4 * x 4 ,此时只需要计算一个x 4  的结果然后再和自身相乘即可,同理x 4 也可以拆分成x 2* x 2 ,以此类推,即可大大缩短用时。这里其实有点类似折半查找。


代码如下:


class Solution {
    public double myPow(double x, int n) {
      // 判断n是正是负
        int pow = n > 0 ? 1 : -1;
        // 最终结果,定义成1在相乘时不影响结果
        double res = 1;
        // 循环相乘即可,这里利用n的奇偶性来判断
        while (n != 0) {
            if (n % 2 != 0) {
                res *= x;
            }
            x *= x;
            n /= 2;
        }
        // 如果n是负数,这里要把前面的结果取倒数
        if (pow == -1) {
            return 1 / res;
        }
        return res;
    }
}


总结:


时间复杂度为O ( l o g 2 n ) ,利用了分治的思想可以缩短用时。

目录
相关文章
|
12月前
|
算法 安全 Swift
LeetCode - #50 Pow(x, n)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode:1. 两数之和 two-sum
LeetCode:1. 两数之和 two-sum
81 0
|
Python
LeetCode 69. Sqrt(x)
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
100 0
LeetCode 50. Pow(x, n)
实现pow(x,n),即计算x的n次方
66 0
LeetCode 50. Pow(x, n)
LeetCode tow Sum 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
69 0
LeetCode tow Sum 两数之和
POJ-2389,Bull Math(大数乘法)
POJ-2389,Bull Math(大数乘法)