思路
- 方法一:暴力破解,时间复杂度 O ( n ) O(n) O(n)
- 方法二:分治思想,也叫快速幂,时间复杂度 O ( log 2 n ) O(\log_2n) O(log2n)
- 方法三:利用位运算右移一位代表除以 2 的特性进行计算,时间复杂度也是 O ( log 2 n ) O(\log_2n) O(log2n)
代码
➥ JavaScript(方法二)
var myPow = function (x, n) {
if (n === 0 || x === 1) {
return 1
}
if (x === -1) {
return n % 2 === 0 ? 1 : -1
}
if (n < 0) {
x = 1 / x
n = -n
}
const divideAndConquer = (x, n) => {
if (n === 1) {
return x
}
const r = n % 2 === 0 ? 1 : x
return divideAndConquer(x, Math.floor(n / 2)) * divideAndConquer(x, Math.floor(n / 2)) * r
}
return divideAndConquer(x, n)
};
➥ JavaScript(方法三)
var myPow = function (x, n) {
if (n < 0) {
x = 1 / x
n = -n
}
let pow = 1
while (n) {
if (n & 1) { // 如果是 1,代表指数是奇数,需要多乘一个 x
pow *= x
}
x = x * x // 这里和方法二的 divideAndConquer * divideAndConquer 差不多
n = n >> 1
}
return pow
}