Given an integer n, return the number of trailing zeroes in n!.
单看这句会觉得这道题so easy,但是再看下面的note:Your solution should be in logarithmic time complexity(时间复杂度为O(logN)).
我说怎么用一开始的解法一直提示"Time limit exceeded"呢,刷了这么多道题我才明白面对这个错误该如何下手解决。。。
解题思路:乘积末位为0 的两个数必然含有2和5这两个约数,而只要存在5就必然存在相应个数的2与之匹配,最基础的方法就是从1~n挨个找出含约数5的整数,而且要重点考察像25这种约数中5的个数有一个以上的数。令i = 0,i <= n,即使每循环一次i += 5,时间复杂度依然不能满足O(log5N)。
public class Solution {
public int trailingZeroes(int n) {
int count = 0;
while (n != 0){
count += n / 5;
n /= 5;
}
return count;
}
}
有多少的5的倍数,就加多少个0;(i / 5)
有多少个25的倍数,就再加多少个0,因为25 = 5 * 5,有两个5;(n/=5; n/5)
有多少个625的倍数,就再加多少个0,因为625 = 5 * 5 * 5,有三个5;(n/=5; n/5)。。。以此类推
感觉这种逻辑乍一看很难明白,但是再仔细想想就能想通了,所以实现了时间复杂度O(log5N)