Factorial Trailing Zeroes

来源:互联网 发布:天津职业大学赛尔网络 编辑:程序博客网 时间:2024/06/01 21:29

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)

0 0