leetcode--Pow(x,n)



题目要求:

就是求x的n次幂。

Notice:要注意x和n的特殊取值

1)n==0的时候,均返回1;

2)x == 1或者x==0时返回 x

3)n可能会等于int的表示范围的最小值INT_MIN,此时要返回1


求解该题的方法有几种,详细参考:http://blog.unieagle.net/2012/08/23/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Apowxn/

参考意见如下:

  1. 最简单的方法,循环n-1遍,每次乘以x。
    时间复杂度:O(N)
    很显然,最后超时了。并且如果用递归的话,函数好写简洁,但是会导致运行时错误(stack overflow)
  2. 还是用二分靠谱:
    xn = xn/2 * xn/2 * xn%2
    时间复杂度:O(logN)
    这样,用时24ms过大测试集合

1.递归的方法:

class Solution {
public:
    double myPow(double x, int n) {
       // assert(x != 0 || n >= 0);//条件不成立则结束程序
        if(n == 0) return 1;
        if(n == 1) return x;
        if(x == 1 || x == 0) return x;
        
        if(n < 0)
        {
            if(n == INT_MIN)
            {
                assert(x == -1);
                return 1;
            }
            return 1.0/pow(x,-n);
        }
        //二分x^n = x^n/2 * x^n/2 * x^n%2
       return x*pow(x,n-1);//递归
    }
};


2.二分的方法:参考:leetcode/c++/powx-n.cpp

3 class Solution { 
4 public: 
5     double pow(double x, int n) { 
6         assert(x != 0 || n >= 0); 
7          
8         if (n == 0) return 1; 
9         if (n == 1) return x; 
10         if (x == 0 || x == 1) return x; 
11         if (n < 0) { 
12             if (n == INT_MIN) { 
13                 assert(x == -1); 
14                 return 1; 
15             } 
16             return 1.0 / pow(x, -n); 
17         } 
18          
19         double half = pow(x, n/2); 
20         if (n % 2 == 0) { 
21             return half * half; 
22         } 
23         return half * half * x; 
24     } 
25 }; 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值