题意:

image.png

解题思路:

  1. (快速幂的递归写法) O(logn)
  2. 1. 每次缩写一半的规模再相乘
  3. 2. n为偶数:24次方 = 22次方 * 22次方
  4. 3. n为奇数:25次方 = 22次方 * 22次方 * 21次方

PHP代码实现:

  1. class Solution {
  2. function myPow($x, $n) {
  3. return $this->myPow1($x, $n);
  4. $n = (float) $n;
  5. if ($n < 0) {
  6. $x = 1 / $x;
  7. $n = -$n;
  8. }
  9. return $this->x2($x, $n);
  10. }
  11. //分治思想(每次取一半的数进行计算,最后相乘)
  12. // 2 2 2 2 2 2 => 2 2 2 = 8 2 2 2 = 8 =》 64
  13. function myPow1($x, $n) {
  14. if (!$n) return 1;
  15. if ($n < 0) {
  16. return 1 / $this->myPow1($x, -$n);
  17. }
  18. if ($n % 2) {
  19. return $x * $this->myPow1($x, $n - 1);
  20. }
  21. return $this->myPow1($x * $x, $n / 2);
  22. }
  23. function x2($x, $n) {
  24. if ($n == 0) return 1;
  25. $half = $this->x2($x, floor($n/2));
  26. if (fmod($n, 2) == 0) {
  27. return $half * $half;
  28. } else {
  29. return $half * $half * $x;
  30. }
  31. }
  32. }

GO代码实现:

  1. func myPow(x float64, n int) float64 {
  2. if n >= 0 {
  3. return x2(x, n)
  4. }
  5. return 1.0 / x2(x, -n)
  6. }
  7. func x2(x float64, n int) float64 {
  8. if n == 0 {
  9. return 1
  10. }
  11. y := x2(x, n / 2)
  12. if n % 2 == 0 {
  13. return y * y
  14. }
  15. return y * y * x
  16. }