LeetCode 0172 Factorial Trailing Zeroes
阿新 • • 發佈:2022-05-29
1. 題目描述
2. Solution 1
1、思路分析
區間[1, n]中質因子p的倍數有\(n_1 = \lfloor \frac{n}{p} \rfloor\)個,這些數至少貢獻了\(n_1\)個質因子。\(p^2\)的倍數有\(n_2=\lfloor \frac{n}{p^2} \rfloor\)個,由於這些數已經是\(p\)的倍數了,為了不重複統計\(p\)的個數,僅考慮額外貢獻的質因子個數,即這些數額外貢獻了至少\(n_2\)個質因子\(p\)。以此類推,[1, n]中質因子\(p\)的個數為 \(\sum_{k=1}^{ \infty}\lfloor \frac{n}{p^k} \rfloor\)
上式表明:
1> n不變,p越大,質因子個數越少,因此[1, n]中質因子5的個數不會大於質因子2的個數;
2> [1, n]中質因子5的個數為: \(\sum_{k=1}^{\infty} \lfloor \frac{n}{5^k} \rfloor < \sum_{k=1}^{\infty} \frac{n}{5^k} = \frac{n}{4} = O(n)\)
程式碼實現時,由於 \(\lfloor \frac{n}{5^k} \rfloor = \lfloor \frac{\lfloor \frac{n}{5^{k-1}} \rfloor }{5} \rfloor\)
因此,可以通過不斷將n除以5,並累加每次除後的n,來得到答案。
2、程式碼實現
package Q0199.Q0172FactorialTrailingZeroes;
/*
Iteration
*/
public class Solution2 {
public int trailingZeroes(int n) {
int res= 0;
while (n >= 5) {
n = n / 5;
res += n;
}
return res;
}
}
3、複雜度分析
時間複雜度: O(log n)
空間複雜度: O(1)
3. Solution 2
1、思路分析
Solution1的遞迴實現。
2、程式碼實現
package Q0199.Q0172FactorialTrailingZeroes;
/*
Because all trailing 0 is from factors 5 * 2.
But sometimes one number may have several 5 factors, for example, 25 have two 5 factors, 125 have tree 5 factors.
In the n! operation, factors 2 is always ample. So we just count how many 5 factors in all number from 1 to n.
*/
public class Solution {
// recursion
public int trailingZeroes(int n) {
return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
}
}
3、複雜度分析
時間複雜度: O(log n)
空間複雜度: O(log n)