美文网首页
LC50 Pow(x,n)

LC50 Pow(x,n)

作者: 锦绣拾年 | 来源:发表于2020-07-28 11:15 被阅读0次

LC50

实现 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 位有符号整数,其数值范围是 [−2^31, 2^31 − 1] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路1:

1)如果n<0,结果取倒数

2)把幂次函数想象成加法。递归时:

n为偶数,则为n/2+n/2(x部分是相乘的)

n为奇数,则为n/2+n/2+1

因为分解成n/2,所以复杂度下降到logn

递归法

class Solution {
public:
    double myPow(double x, int n) {
        if(n==1)
        return x;
        if(n==0)
        return 1;
        int tmpn=n;
        n=abs(n);
        double res=0.0;
        double temp=myPow(x,n/2);
        if(n%2==0){
          
            res=temp*temp;
        }else{
            
            res=temp*temp*x;
        }
        if(tmpn<0)
        res=1/res;
        return res;

    }
};

时间复杂度:O(\log n)O(logn),即为递归的层数。

空间复杂度:O(\log n)O(logn),即为递归的层数。这是由于递归的函数调用会使用栈空间。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/powx-n/solution/powx-n-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路2:

作者:jyd
链接:https://leetcode-cn.com/problems/powx-n/solution/50-powx-n-kuai-su-mi-qing-xi-tu-jie-by-jyd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二进制角度

对于任何十进制正整数n,设其二进制为“b_m\dots b_3b_2b_1”(b_i为二进制某位值,i\in[1,m]),则有:

  • 二进制转十进制:n=1b_1+2b_2+4b_3+\dots+2^{m-1}b_m(即二进制转十进制公式);
  • 幂的二进制展开:x^n=x^{1b_1+2b_2+4b_3+\dots+2^{m-1}b_m}=x^{1b_1}x^{2b_2}x^{4b_3}\dots x^{2^{m-1}b_m}

而任意十进制数都可以用二进制表示。

因此可以把计算x^n转化为其它问题:

  • 计算x^1,x^2,x^4,\dots,x^{2m-1}的值,计算时循环赋值,平方计算即可。x=x^2
  • 获取n转换为二进制的值。即b_1,b_2,\dots,b_m

【十进制如何转二进制】

[判题过程巨慢 不知道为什么]

class Solution {
public:
    double myPow(double x, int n) {
        if(n==1)
        return x;
        if(n==0)
        return 1;
        int tmpn=n;
        n=abs(n);
        double res=1.0;
        double temp=x;
        while(n>0){//理由除法余数得到二进制数。
            if(n%2==1){
                res=res*temp;
            }
            temp=temp*temp;
            n=n/2;
        }

        if(tmpn<0)
        res=1/res;
        return res;

    }
};

相关文章

网友评论

      本文标题:LC50 Pow(x,n)

      本文链接:https://www.haomeiwen.com/subject/kyqfrktx.html