Analysis:
If we just use the normal way of calculation, when face 1 to the power of 10000, the computation complexity is too high.
Consider this way:
If we want to get 2^10,
2^10 = 2^4 * 2^4 *2^2
2^4 = 2^2*2^2
2^2 = 2*2
Let's see this in a bottom-up way, totally it needs to loop n/2 > 0 times, first we have 2^1=2, then we can have 2^2 = 2*2=4, and again we have 2^4 = 4*4, (key point:) and if n%2==1, we need one more previous value, which is 2^2 here, so we have 2^4*2^4*2^2 = 2^10.
Details see the code below.
Source Code:
class Solution {
public:
double pow(double x, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int sign = n>=0?1:-1;
double y=1;
for (int i=0;i<abs(n);i++){
y=y*x;
}
if (sign==-1) {return 1/y;}
else {return y;}
}
};
class Solution {
public:
double pow(double x, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (x==0){
if (n==0){return 1;}
else {return 0;}
}
if (n==0){
return 1;
}
bool pos=true;
if (n<0){
pos = false;
n=abs(n);
}
double np=x;
double res=1;
while (n>0){
if (n%2==1){
res = res * np;
}
np=np*np;
n=n/2;
}
return pos? res:1/res;
}
};
Wouldn't n =int_min cause overflow in ur solution?
ReplyDeleteNing Zhu is right
Deleteyou can reference this:
// nonrecursive implementation
// its not the fast one, only runtime beats 29.88% of java submissions on 2/1/2016.
static double power2(double x, int n) {
if (x == 1) {
return 1;
}
if (x == -1) {
return n % 2 == 0 ? 1 : -1;
}
boolean negative = false;
if (n < 0) {
negative = true;
n = -n;
}
double result = 1;
while (n != 0) {
if ((n & 1) == 1) {
result *= x;
}
x *= x;
n >>= 1;
}
return negative ? 1 / result : result;
}
This comment has been removed by the author.
ReplyDelete