劍指Offer題目11:實現函數double Power(double base, int exponent),求base的exponent次方。(Java)

面試題11:給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。面試

解題思路

思路1:brute force 累乘法,時間複雜度O(n)

挨個乘,exponent 爲 n,則累乘 n 次得出結果。

思路2:使用遞歸,時間複雜度O(logn)

當n爲偶數,a^n =(a^n/2)*(a^n/2)

當n爲奇數,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a

思路3:同遞歸的思路,但採用循環法(遞歸和循環都是能夠互換的)

複製代碼

代碼實現

  1. brute force 累乘法
public double Power(double base, int exponent) {
        if(base == 0) {
            return 0;
        }
        double result = 1.0;
        int positiveExponent = Math.abs(exponent);
        for(int i=1; i<=positiveExponent; i++) {
            result *= base;
        }
        return exponent < 0 ? 1/result : result;
  }
複製代碼

  1. 遞歸法
public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0) {
            return 0;
        }
        int positiveExponent = Math.abs(exponent);
        double result = PowerPositiveExponent(base, positiveExponent);
        return exponent < 0 ? 1 / result : result;
    }
    
    private double PowerPositiveExponent(double base, int n){
        if(n == 0) {
            return 1.0;
        }
        if(n == 1) {
            return base;
        }
        double result = PowerPositiveExponent(base, n >> 1);
        result *= result;
        if((n & 1) == 1) {
            result *= base;
        }
        return result;
    }
}
複製代碼

  1. 循環法
public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0) {
            return 0;
        }
        double result = 1.0;
        int positiveExp = Math.abs(exponent);
        while(positiveExp != 0){
            //此處判斷奇數,這一步至少會走兩次:
            //若是是奇數,第一次就會進入這個判斷。移位到最後爲1時,也會進入這個判斷
            if((positiveExp & 1) == 1){
                result *= base;
            }
            base *= base;
            positiveExp = positiveExp >> 1;
        }
        return exponent < 0 ? 1 / result : result;
    }
}
複製代碼

總結

通常是想不出後面的思路的,記住便可。思想都是保存中間值,避免重複計算。算法

這個思想本質上和 《斐波那契算法 》的保存中間值的思想是同樣的。bash

相關文章
相關標籤/搜索