LeetCode C++ 50. Pow(x, n)【Recursion】中等
Implement pow(x, n), which calculates x raised to the power n (i.e. xn).
Example 1:
Input: x = 2.00000, n = 10 Output: 1024.00000
Example 2:
Input: x = 2.10000, n = 3 Output: 9.26100
Example 3:
Input: x = 2.00000, n = -2 Output: 0.25000 Explanation: 2-2 = 1/22 = 1/4 = 0.25
Constraints:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
題意:實現函式 double Power(double base, int exponent)
,求 base
的 exponent
次方。不得使用庫函式,同時不需要考慮大數問題。
雖然不用考慮大數問題,但這不是意味著簡單遞迴/迭代乘法,就能夠完成這一道題——比如 1.00000 2147483647
,順序相乘絕對會超時。
解法1 遞迴快速冪
class Solution {
public:
double myPow(double x, int n) {
if (n == 0) return 1; //正數右移最後得到0
if (n == 1) return x;
if (n == -1) return 1 / x; //負數右移永遠是負數,加一個判斷
double temp = myPow(x, n >> 1);
if (n & 1) return temp * temp * x;
else return temp * temp;
}
};
執行效率如下:
執行用時:0 ms, 在所有 C++ 提交中擊敗了100.00% 的使用者
記憶體消耗:6.1 MB, 在所有 C++ 提交中擊敗了28.57% 的使用者
或者寫成:
class Solution {
public:
double myPow(double x, int n) {
if (n == 0) return 1; //正數右移最後得到0
if (n == 1) return x;
if (n == -1) return 1 / x; //負數右移永遠是負數
if (n & 1) return myPow(x, n - 1) * x;
double temp = myPow(x, n >> 1);
return temp * temp;
}
};
解法2 迭代快速冪
class Solution {
public:
double myPow(double x, int n) {
double ans = 1, base = x;
bool flag = (n >= 0);
//負數取反,考慮到最小負數,需要先自增,後續再多除一個x
if (!flag) n = -(++n); //或者使用longlong
while (n) {
if (n & 1) ans *= base;
base *= base;
n >>= 1; //n必須取正
}
return flag ? ans : 1 / ans / x;
}
};
執行效率如下:
執行用時:0 ms, 在所有 C++ 提交中擊敗了100.00% 的使用者
記憶體消耗:6.1 MB, 在所有 C++ 提交中擊敗了20.39% 的使用者
或者一開始 n
不取正,而是使用 / 2
代替右移,這樣不論正負 n
最終都會縮小到 0
:
class Solution {
public:
double myPow(double x, int n) {
double ans = 1, base = x;
bool flag = (n >= 0);
while (n) {
if (n & 1) ans *= base;
base *= base;
n /= 2; //換成/2,不用擔心負數問題
}
return flag ? ans : 1 / ans;
}
};
執行效率如下:
執行用時:0 ms, 在所有 C++ 提交中擊敗了100.00% 的使用者
記憶體消耗:6.3 MB, 在所有 C++ 提交中擊敗了8.13% 的使用者
相關文章
- 50. Pow(x, n)
- LeetCode C++ 劍指 Offer 64. 求1+2+…+n【Bit Manipulation】中等LeetCodeC++
- LeetCode C++ 376. Wiggle Subsequence【Dynamic Programming】中等LeetCodeC++
- LeetCode C++ 56. Merge Intervals【排序/陣列】中等LeetCodeC++排序陣列
- LeetCode C++ 316. Remove Duplicate Letters【Stack/Greedy/String】中等LeetCodeC++REM
- LeetCode C++ 1302. Deepest Leaves Sum【Tree/BFS/DFS】中等LeetCodeC++
- LeetCode C++ 33. Search in Rotated Sorted Array【二分】中等LeetCodeC++
- js解leetcode(32)-中等JSLeetCode
- LeetCode#110.Balanced Binary Tree(Tree/Height/DFS/Recursion)LeetCode
- JAVA-LeetCode中等29兩數相除JavaLeetCode
- Understanding Recursion
- LeetCode-5426、重新規劃路線-中等LeetCode
- 一個數number的n次冪 python的pow函式Python函式
- 【leetcode】LCP 19. 秋葉收藏集(UlBDOe)(DP)[中等]LeetCode
- 【LeetCode刷題(中等程度)】946. 驗證棧序列LeetCode
- LeetCode 52. N皇后 IILeetCode
- [LeetCode 中等 動態規劃 ]221. 最大正方形LeetCode動態規劃
- leetcode:面試題 01.08. 零矩陣(陣列,中等)LeetCode面試題矩陣陣列
- LeetCode: 1052. 愛生氣的書店老闆(中等)LeetCode
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- 【leetcode】19. 刪除連結串列的倒數第N個節點(remove-nth-node-from-end-of-list)(雙指標)[中等]LeetCodeREM指標
- LeetCode之N-Repeated Element in Size 2N Array(Kotlin)LeetCodeKotlin
- LeetCode-N9-迴文數LeetCode
- 關於宏定義 Bin(n),LongToBin(n),LongToBin(0x##n##L)
- 22. Generate Parentheses (recursion algorithm)Go
- 【LeetCode刷題(中等程度)】662. 二叉樹最大寬度LeetCode二叉樹
- leetcode-69. Sqrt(x)LeetCode
- 5.1 PoW概念
- LeetCode19題 刪除連結串列的倒數第N個節點 (c++ 遞迴)LeetCodeC++遞迴
- leetcode 整數拆分(c++)LeetCodeC++
- Leetcode 559. N叉樹的最大深度LeetCode
- JavaScript Math.pow()JavaScript
- 【Leetcode 346/700】79. 單詞搜尋 【中等】【回溯深度搜尋JavaScript版】LeetCodeJavaScript
- 【轉】sed命令n,N,d,D,p,P,h,H,g,G,x解析
- LeetCode 1137[第N個泰波那契數]LeetCode
- LeetCode 1137第N個斐波那契數LeetCode
- LeetCode878. 第 N 個神奇數字(java)LeetCodeJava
- LeetCode 69[x的平方根]LeetCode