快速幂+递归
-
解题思路:
- 对于一个 x 的 n 次方: 如果 n 小于 0 ,x 的 n 次方 等于 1/x 的 -n 次方(此时 -n 为正数);
- 如果 n 是一个偶数:x 的 n 次方 等于 x*x 乘以 n/2 次方;
- 如果 n 是一个奇数:x 的 n 次方 等于 x 乘以 x 的 n-1 次方;
- 如果 n 等于 0 ,直接返回 1;
-
图解:
-
复杂度:
- 时间复杂度:O(logn),即为递归的层数;
- 空间复杂度:O(logn),即为递归的层数,这是由于递归的函数调用会使用栈空间;
-
代码实现:
function myPow(x: number, n: number): number { // n=0 直接返回 1 if (n === 0) return 1; // n<0 时 x 的 n 次方等于 1 除以 x 的 -n 次方分 if (n < 0) return 1 / myPow(x, -n); // n 是奇数时 x 的 n 次方 = x*x 的 n-1 次方 if (n % 2) return x * myPow(x, n - 1); // n 是偶数,使用分治,一分为二,等于 x*x 的 n/2 次方 return myPow(x * x, n / 2); }
快速幂+位运算
-
解题思路:
-
复杂度:
- 时间复杂度:O(logn),二分的时间复杂度为对数级别;
- 空间复杂度:O(1),变量占用常数大小额外空间;
-
代码实现:
function myPow(x: number, n: number): number { // 如果 n 小于 0 ,x 的 n 次方 等于 1/x 的 -n 次方(此时 -n 为正数) if (n < 0) { x = 1 / x; n = -n; } let result = 1; while (n) { // 判断 n 的二进制最后一位是 1,则将结果乘以 x if (n & 1) result *= x; // n 是一个偶数:x 的 n 次方 等于 x*x 乘以 x 的 n/2 次方 x *= x; n >>>= 1; } return result; };
打赏作者
您的打赏是我前进的动力
微信
支付宝
leetcode🧑💻 493. 翻转对
上一篇
评论