解法1:快速幂
注意:
●要考虑各种边界条件,如x为0且n为负数的情况,如x为0且n为0的情况。
●要注意double的判等不能用==
思想:
https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/solution/mian-shi-ti-16-shu-zhi-de-zheng-shu-ci-fang-kuai-s/
有二分法的思想在里面:
复杂度:
●时间:二分法思想O(logn)
●空间:常数空间O(1)
代码:
class Solution {
public:
double myPow(double x, int n) {
//要问面试官0的0次方返回什么,再写代码
//要考虑x为1时,n为0时的特殊情况
if(equal(x, 1.0) || n == 0)
return 1;
//询问面试官x为0,且n为负时返回什么,因为x为0时取倒数会出问题
if(equal(x, 0.0) && n < 0)
return 0;
//要将n从负转正,int可能会溢出,因为负数绝对值更大,所以用long来存储
long num = n;
double res = 1;
if(n < 0){
num = -num;
x = 1/x;
}
while(num){
if(num & 1)
res *= x;
x *= x;
num >>= 1;
}
return res;
}
//比较两个double数是否相等
bool equal(double num1, double num2){
return fabs(num1 - num2) < 1e-15;
}
};