题目要求:
就是求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/
参考意见如下:
- 最简单的方法,循环n-1遍,每次乘以x。
时间复杂度:O(N)
很显然,最后超时了。并且如果用递归的话,函数好写简洁,但是会导致运行时错误(stack overflow) - 还是用二分靠谱:
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 };