剑指 Offer 16.数值的整数次方
一、递归方式
Java 代码中 int32 变量 n∈[−2147483648,2147483647] ,因此当 n = -2147483648 时执行 n = -n 会因越界而赋值出错。解决办法是1/x * mypow(1/x, -n-1).
class Solution {
public double myPow(double x, int n) {
if(x == 0 || x == 1) return x;
if(n == 0) return 1;
if(n < 0) return (1 / x) * myPow(1 / x, - n - 1);
if(n % 2 != 0) return x * myPow(x * x, n / 2);
else return myPow(x * x, n / 2);
}
}
时间复杂度 O(logn) 空间复杂度 O(logn)
二、非递归方法
如果一个数为奇数,再除2的过程中会有两次得数为奇数,第一次和最后一次,最后一次必为1,因此第一次多乘一个x,最后一个1将值赋给res。如果一个数为偶数,只会有一个1,就是最后赋值给res的时候。妙啊!
class Solution {
public double myPow(double x, int n) {
if(x == 0 || x == 1) return x;
if(n == 0) return 1;
double res = 1.0;
for(int i = n; i != 0; i /= 2, x *= x) {
if(i % 2 != 0) {
res *= x;
}
}
return n > 0 ? res : 1.0 / res;
}
}
时间复杂度O(logn)空间复杂度O(1)