LeetCode 第 50 題 (Pow(x, n))
LeetCode 第 50 題 (Pow(x, n))
Implement pow(x, n).
這個題目非常簡短,求
x^n
。其中n
為整數。 最簡單的想法就是用一個迴圈,將
x
自乘n
次。按照這個思路有下面的程式碼。
class Solution
{
public:
double myPow(double x, int n)
{
int sign = 1;
if(n < 0)
{
n = -n;
sign = -1;
}
double ret = 1;
for(int i = 0; i < n; i++)
{
ret = ret * x;
}
if(sign == -1)
{
ret = 1 / ret;
}
return ret;
}
};
這個程式碼雖然從原理上是正確的,但是當
n
比較大時執行速度實在是太慢。這樣提交的話肯定會執行超時。 所以我們要想點其他的辦法。
我們知道
x^{n_1 + n_2} = x^{n_1} \times x^{n_2}
。如果 x^{n_1}
和 x^{n_2}
很容易算出來的話這樣比直接算x^{n_1 + n_2}
要快速。
而
n = \sum_{i=0}^{31} c_i \times 2^i
x^2
, x^4
, x^{16} \ldots
這樣的數字很容易計算的。所以我們可以利用這個特點來加快計算。下面是程式碼:
double myPow(double x, int n)
{
double table[32];
int sign;
table[0] = x;
for(int i = 1; i < 32; i++)
{
table[i] = table[i - 1] * table[i - 1];
}
if(n < 0)
{
n = -n;
sign = -1;
}
double ret = 1;
int i = 0;
while(n)
{
if(n & 1) ret = ret * table[i];
n = (unsigned int)n >> 1;
i ++;
}
if(sign == -1)
{
ret = 1 / ret;
}
return ret;
}
這個程式碼還有一處需要特別解釋解釋。
n = (unsigned int)n >> 1;
為什麼這裡要加上 “(unsigned int)”? 只是為了應對一個特殊條件,就是
n = -2147483648
,這個數是最小的 int 型變數(INT_MIN),-n
不在 int 型變數所能表示的數字範圍內,-n = -2147483648
。
對於負數,
n = n >> 1
之後 n
的最高位還是 1
。 所以當
n = -2147483648
時,下面這個迴圈是死迴圈。
while(n)
{
n = n >> 1;
}
所以這裡要將 n 轉換為 unsigned int 型別。
上面的程式碼還可以再優化一點。我們可以原地計算上面程式碼中用到的那個 Table。下面是程式碼。
double myPow(double x, int n)
{
int sign;
if(n < 0)
{
n = -n;
sign = -1;
}
double ret = 1;
while(n)
{
if(n & 1) ret = ret * x;
x = x * x;
n = (unsigned int)n >> 1;
}
if(sign == -1)
{
ret = 1 / ret;
}
return ret;
}
相關文章
- LeetCode C++ 50. Pow(x, n)【Recursion】中等LeetCodeC++
- Leetcode Pow(x,n)LeetCode
- Leetcode-Pow(x,n)LeetCode
- Pow(x,n) leetcode javaLeetCodeJava
- LeetCode 第 69 題 (Sqrt(x))LeetCode
- LeetCode-Super PowLeetCode
- LeetCode 之 JavaScript 解答第69題 —— X 的平方根(Squrt(x))LeetCodeJavaScript
- Leetcode題解1-50題LeetCode
- LeetCode878. 第 N 個神奇數字(java)LeetCodeJava
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- Leetcode第1~10題LeetCode
- LeetCode 1137第N個斐波那契數LeetCode
- LeetCode 1137[第N個泰波那契數]LeetCode
- 深度學習面試100題(第46-50題)深度學習面試
- LeetCode題解第122題LeetCode
- LeetCode刷題之第701題LeetCode
- LeetCode 第 7 題(Reverse Integer)LeetCode
- LeetCode 第 342 題(Power of Four)LeetCode
- LeetCode 第 343 題 (Integer Break)LeetCode
- LeetCode 第 66 題 (Plus One)LeetCode
- leetcode每日一題—19.刪除連結串列的倒數第N個結點LeetCode每日一題
- 一個數number的n次冪 python的pow函式Python函式
- LeetCode 刷題日記 19. 刪除連結串列的倒數第N個節點LeetCode
- LeetCode 50 JSLeetCodeJS
- LeetCode 第 9 題(Palindrome Number)LeetCode
- LeetCode 第 190 題 (Reverse Bits)LeetCode
- LeetCode 第 37 題 (Sudoku Solver)LeetCode
- LeetCode 第 326 題 (Power of Three)LeetCode
- LeetCode 第 65 題(Valid Number)LeetCode
- [leetcode 第 400 場周賽]題解LeetCode
- LeetCode19題 刪除連結串列的倒數第N個節點 (c++ 遞迴)LeetCodeC++遞迴
- KMP演算法(Leetcode第28題)KMP演算法LeetCode
- leetcode的第9題:迴文數LeetCode
- LeetCode 第 231 題 (Power of Two)LeetCode
- LeetCode 第 191 題 (Number of 1 Bits)LeetCode
- LeetCode 第 338 題 (Counting Bits)LeetCode
- LeetCode 第 14 題(Longest Common Prefix)LeetCode
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java