1. 题目描述

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

示例 1:

  1. 输入:x = 2.00000, n = 10
  2. 输出:1024.00000

示例 2:

  1. 输入:x = 2.10000, n = 3
  2. 输出:9.26100

示例 3:

  1. 输入:x = 2.00000, n = -2
  2. 输出:0.25000
  3. 解释:2-2 = 1/22 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -2<= n <= 2-1
  • -10 <= xn <= 10

    2. 解题思路

这道题直接的思路就是暴力计算,判断n的正负,如果为正就让底数x直接累乘,如果为负就让底数的倒数1/x累乘。

但是超出了时间限制,可以使用二分法进行优化:**

我们可以进行折半计算,每次将n缩小一半,通过递归最终获得结果。注意,当n为奇数时,需要多乘一次x的值。

时间复杂度:O(logn),空间复杂度:O(logn)

3. 代码实现

暴力:

  1. /**
  2. * @param {number} x
  3. * @param {number} n
  4. * @return {number}
  5. */
  6. var myPow = function(x, n) {
  7. if(n === 0){
  8. return 1
  9. }
  10. const base = n > 0 ? x : 1/x
  11. let result = 1
  12. for(let i = 1; i <= Math.abs(n); i++){
  13. result = result * base
  14. }
  15. return result
  16. };

二分法:

  1. /**
  2. * @param {number} x
  3. * @param {number} n
  4. * @return {number}
  5. */
  6. var myPow = function(x, n) {
  7. if(n === 0){
  8. return 1
  9. }else if(n === 1){
  10. return x
  11. }else if(n === -1){
  12. return 1/x
  13. }
  14. const base = n > 0 ? x : 1/x
  15. const half = parseInt(n/2, 10)
  16. let result = myPow(x, half)
  17. if(n % 2){
  18. return base * result * result
  19. }
  20. return result * result
  21. };

4. 提交结果

二分法:
50. Pow(x,n) - 图1