leetcode 50 Pow(x,n) (C#)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/moon_goes/article/details/102314562

题目

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

解题

解法一:暴力法。
求x的n次方,最简单的就是xxxx…*x(总共n个x相乘)。一个for循环就可以搞定,但是不出所望,这种方法果然超时。

解法二:递归。
主要思想是,当我们得知 x^2 时,我们要求x ^4就不必xxx*x来求,而是直接通过 x ^2 ·x ^2就可以求得x ^4。以此类推,我们通过x ^4能得到x ^8等。这就使时间复杂度降低到O(logn)。

在调用递归函数PowHalf之前,我们要先处理一下幂指数n。当n>0时,直接把x和n传递给递归函数;当n=0时,任何数(除0外,题目的测试用例应该也没有给0做底数)的0次幂都是1;当n<0时,x等于它的倒数,n取相反数,传递给递归函数。

递归函数中,n有3种情况:
1.n=0,递归的边界条件,此时返回1;
2.n是偶数,那么只需要temp*temp,例如【N^4】,等同于N ^2 * N ^2;
3.n是奇数,那么我们需要temp * temp * x,例如【N ^5】,
等同于N ^2 * N ^2 * N。

需要注意的点
在调用递归函数之前,先把幂指数的正负处理好。

public double MyPow(double x, int n) {
        if(n<0){
            x=1/x;
            n=-n;
            return PowHalf(x,n);
        }
        else{return PowHalf(x,n);}
    }
    
    public double PowHalf(double x,int n){
        if(n==0){
            return 1;
        }
        else if((n&1)==0){
            double temp=PowHalf(x,n/2);
            return temp*temp;
        }
        else{
            double temp=PowHalf(x,n/2);
            return temp*temp*x;
        }
    }

代码参考:https://leetcode-cn.com/problems/powx-n/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–15/

猜你喜欢

转载自blog.csdn.net/moon_goes/article/details/102314562