pow(x,n)
[code]
public class Solution {
public double pow(double x, int n) {
if(x==0)return 0;
if(n==0)return 1;
boolean negative= n<0;
n=Math.abs(n);
double half=pow(x, n/2);
double r= n%2==0 ? half*half : half*half*x;
return negative ? 1/r : r;
}
}
[Thoughts]
corner cases: x<0, n<0, x=0, n=0, overflow
sqrt(x)
[code]
public class Solution {
public int sqrt(int x) {
if(x<0)return -1;
if(x==0)return 0;
int i=1;
while(i*i<x && i*i<=Integer.MAX_VALUE/4)i*=2;
if(i*i==x)return i;
if(i*i<x)
{
while(i*i<x && i*i>0 )i++;
if(i*i==x)return i;
return i-1;
}
else
{
int low=1, high=i;
while(low<high-1)
{
int mid=(low+high)/2;
int pow=mid*mid;
if(pow==x)return mid;
else if(pow<x)
{
low=mid;
}
else high=mid-1;
}
if(low==high)return low;
else if(low==high-1)
{
int p1=low*low, p2=high*high;
if(p1==x)return low;
if(p2==x)return high;
if(p2>x)return low;
return high;
}
return 0;
}
}
}
[Thoughts]
这题难点在于处理overflow.
i*i 会造成溢出, 所以干脆用除法。。。有个更简洁的code.
之所以简洁是因为 if(p>q)return q
1. 一个元素, mid<x, return q
2. 一个元素, mid>x, return q
3. 二个元素 , mid>x, return q
[code]
public int sqrt(int x) {
return sqrt(x, 1, x);
}
private int sqrt(int x, int p, int q) {
if (p > q)
return q;
int mid = (p + q) / 2;
if (x / mid == mid)
return mid;
else if (x / mid < mid )
return sqrt(x, p, mid - 1);
else
return sqrt(x, mid + 1, q);
}