50:Pow(x,n)(C++)
阿新 • • 發佈:2020-08-21
題目地址:https://leetcode-cn.com/problems/powx-n/
題目描述
實現pow(x,n),即計算 x 的 n 次冪函式
題目示例
示例 1:
輸入: 2.00000, 10
輸出: 1024.00000
示例2:
輸入: 2.10000, 3
輸出: 9.26100
示例3:
輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25
說明:
-100.0 <x< 100.0
n是 32 位有符號整數,其數值範圍是[−231,231− 1] 。
解題思路
思路1:暴力求解。求解思路為迴圈累乘,不過需要注意的是n的正負,該方法求解過程存在超時的問題,時間複雜度O(n)。
思路2:使用折半遍歷進行暴力優化。
思路3:分治+回溯。可以理解為將Pow(x,n)的問題分解為子問題Pow(x,n/2),時間複雜度為O(logn),因為每次都減半。
程式原始碼
思路1
class Solution { public: double myPow(double x, int n) { double res = 1.0; long num = n; if(n < 0) { x = 1 / x; num = -num; } for(int i = 0; i < num; ++i) { res*= x; } return res; } };
思路2
class Solution { public: double myPow(double x, int n) { double res = 1.0; long num = n; if(n < 0) { x = 1 / x; num = -num; } for(int i = num; i != 0; i /= 2) {if(i % 2 != 0) { res *= x; } x *= x; } return res; } };
思路3
class Solution { public: double myPow(double x, int n) { long num = n; if(n < 0) { x = 1 / x; num = -num; } return fast_pow(x, num); } double fast_pow(double x, long n) { if(n == 0) return 1.0; double half = fast_pow(x, n / 2); /*if(n % 2 == 0) return half * half; else return half * half * x;*/ return n % 2 == 0? half * half : half * half * x; //對註釋程式碼進行化簡 } };