题目链接:Pow(x, n)
Implement pow(x, n).
这道题的要求是实现pow(x, n)函数。
求x的n次幂。直接的暴力思路,将x乘以自身n次即可,时间复杂度O(n)。当n非常大时,计算时间过长。
考虑将n转化为二进制数,即n = a0*2^0 + a1*2^1 + a2*2^2 + ... + an*2^n。而求x的n次幂,即为x^n = x^(a0*2^0 + a1*2^1 + a2*2^2 + ... + an*2^n) = x^(a0*2^0) * x^(a1*2^1) * x^(a2*2^2) * ... * x^(an*2^n)。
例如当n等于11的时候,
n=11: 1 0 1 1 (高位->低位)
结果: x^4 x^2 x^1(连乘的结果)
因此,每次将n除以2,将x乘以x,这样,当二进制的某位为1时,将此时的x乘到结果上。
注意一个问题,当n为负数的时候,需要将结果用1除一下。同时,由于负数右移1位并不等于除以2,因此不能为了提高速度而用移位来代替除以2的运算。
时间复杂度:O(logn)
空间复杂度:O(1)
1 class Solution
2 {
3 public:
4 double pow(double x, int n)
5 {
6 double res = 1.0;
7 for(int i = n; i != 0; i /= 2, x *= x)
8 if(i & 1)
9 res *= x;
10 return n >= 0 ? res : 1.0 / res;
11 }
12 };