劍指offer系列——數值的整數次方

題目描述

實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。

輸入輸出

示例1:
輸入:2.00000 10
輸出:1024.00000

示例2:
輸入:2.10000 3
輸出:9.26100

示例3:
輸入:2.00000 -2
輸出:0.25000
解釋:2^-2 = 1/2^2 = 1/4 = 0.25

說明:

  • -100.0< x <100.0
  • n是32位有符號整數,其數值範圍是[-231,231 -1]。

算法思路(二分法)

  • 當n是偶數時,x^n = (x2)(n/2)
  • 當n是奇數時,x^n = x(x2)(n/2),相比偶數多出了一項x
  • 在這裏插入圖片描述

代碼

package leetcode;

/**
 * @author god-jiang
 * @date 2020/3/10  19:41
 */
public class Power {
    public double myPow(double x, int n) {
        //避免當n爲最大值時,進行n=-n時數據越界出錯
        long exponent = n;
        if (n < 0) {
            x = 1 / x;
            exponent = -exponent;
        }
        double res = 1.0;
        while (exponent != 0) {
            //奇數多出了一項x
            if ((exponent & 1) == 1) {
                res = res * x;
            }
            //二分操作
            x = x * x;
            exponent = exponent >> 1;
        }
        return res;
    }
}

通過截圖

在這裏插入圖片描述

複雜度分析

  • 時間複雜度:O(logN)。跟二分操作的時間複雜度一樣
  • 空間複雜度:O(1)。沒有引入額外的變量

ps:參考leetcode大佬Krahets的解答。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章