@[TOC](Leecode50 Pow(x,n))
题目:
50:实现 pow(x, n) ,即计算 x 的 n 次幂函数。
思路:
-
使用库函数,但一般都要求不这么做,失去了题目的价值了;
-
循环暴力乘,时间复杂度O(n);
-
5^4实际上等于 15^2,以此思想实现时间复杂度为O(logN)的解法;
第三思路详细分析:
-
注意N为负数的时候应该将N变成正数,并且x = 1/x;
-
如果N为偶数,则x = x*x, n= n / 2, 除2操作可考虑使用位运算 n>>= 1;
-
如果N为奇数,则x=x*x,n >>=1;且在此基础上再乘以x即可;
代码实现:
1,递归实现:
class Solution {
public double myPow(double x, int n) {
long absn = n // 当n为-2147483648时,单纯的n=-n已经不行了,溢出了;
if(absn < 0){
x = 1 / x;
absn = -absn;
}
if(absn == 1)return x;
if(absn == 0) return 1;
if((absn & 1) == 1){
return x * myPow(x*x, absn >>> 1);
} else {
return myPow(x*x, absn >>> 1);
}
}
}
2 循环实现:
class Solution {
public double myPow(double x, int n) {
long absn = n; // 当n为-2147483648时,单纯的n=-n已经不行了,溢出了;
if(absn < 0){
x = 1 / x;
absn = -absn;
}
double sum = 1.0;
while(absn > 0){
if((absn & 1) == 1){
sum *= x;
}
absn >>>= 1;
x *= x;
}
return sum;
}
}