Leetcode每日一题 172. 阶乘后的零 数学结论题 我也不会 但是刷到了就要记住了

460 阅读3分钟

📖本篇内容:Leetcode每日一题 172. 阶乘后的零 数学结论题 我也不会 但是刷到了就要记住了
📑 文章专栏:leetcode每日一题《打卡日常》
📆 最近更新:2022 年 3 月24日 Leetcode每日一题 661. 图片平滑器 二维前缀和公式以及矩阵边界问题
⭐算法仓库:小付的算法之路——Alascanfu-algorithm.git.io
🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊写在前面🙊

题目

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例1:

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0

示例2:

输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0

示例3:

输入:n = 0
输出:0

提示

0 <= n <= 10^4

📝思路📝

本题考查知识点

大佬的题解

  • 小付理解的思路:末尾有多少个零取决于的是有多少个偶数乘以5可以构成一个10 进行相乘这样末尾就会多增加一个0 这样就可以知道每个数可以有几个2和5构成,每对2和5就能构成一个尾部零,我们只需要能凑够多少对数就知道尾部会有多少个0了,知道这个了我们就需要知道2和5在n!中出现的次数少的那个就是二者能够出现最多的对数,可以很清楚的知道,5的个数肯定比2的个数少所以我们只需要求取每次需要进行乘的数能分出多少个5的个数就知道就多少个尾部0了。

  • 不出意外这题是可以过得,不过这只是考虑了给定的 n 为 10410^4 以内,如果 n 给定的数值是足够大的话,那么很大情况这道题会超时,因为按照上述的方法做出来其时间复杂度为 O(nlogn)O(nlogn) ,如果给定的 n 为 10810^8 这题绝对会TLE ,所以官方放我们设计一个时间复杂度为 O(logn)O(logn) 的算法来处理,我们接着来看,如何对上述的代码进行优化,我们本质是为了求每个数中 5 的个数,那么如果数等于 25 时里面就是有 2 个 5 ,那么以此类推能知道125 = 5*5*5 那么每当125个数字时就是要+3个5所以总共 5 的个数是 n/5+n/25+n/125+...+n/5nn/5 + n/25 + n/125 + ... + n/5^n 剩下的就交给程序计算即可。

⭐代码实现⭐

暴力数学

class Solution {
    public int trailingZeroes(int n) {
        int cnt = 0 ;
        for (int i = 1; i<= n;i++){
            int curNum = i;
            while(curNum > 0){
                if (curNum % 5 == 0){
                    cnt++;
                    curNum/=5;
                }else {
                    break;
                }
            }
        }
        return cnt;
    }
}
  • 时间复杂度: O(nlognnlogn)
  • 空间复杂度: O(11)

数学优化

class Solution {
    public int trailingZeroes(int n) {
        int cnt = 0 ;
        while (n > 0){
            cnt = cnt +  n / 5; //  n/5 + n/25 + ... +> n/5^n
            n = n / 5;//  n/5 --> n/25 --> ... --> n/5^n
        }
        return cnt;
    }
}
  • 时间复杂度: O(lognlogn)
  • 空间复杂度: O(11)

运行结果

暴力数学

image.png

数学优化 image.png

🙊写在最后🙊

2022- 3- 25今天小付打卡了哦~

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

6.gif