Factorial Trailing Zeroes

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值