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

📖本篇内容: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 为 1 0 4 10^4 104 以内,如果 n 给定的数值是足够大的话,那么很大情况这道题会超时,因为按照上述的方法做出来其时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn) ,如果给定的 n 为 1 0 8 10^8 108 这题绝对会TLE ,所以官方放我们设计一个时间复杂度为 O ( l o g n ) O(logn) O(logn) 的算法来处理,我们接着来看,如何对上述的代码进行优化,我们本质是为了求每个数中 5 的个数,那么如果数等于 25 时里面就是有 2 个 5,那么以此类推能知道125 = 5*5*5那么每当125个数字时就是要+3个5所以总共 5 的个数是 n / 5 + n / 25 + n / 125 + . . . + n / 5 n n/5 + n/25 + n/125 + ... + n/5^n n/5+n/25+n/125+...+n/5n 剩下的就交给程序计算即可。

⭐代码实现⭐

暴力数学

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( n l o g n nlogn nlogn)
  • 空间复杂度: O( 1 1 1)

数学优化

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( l o g n logn logn)
  • 空间复杂度: O( 1 1 1)

运行结果

暴力数学

在这里插入图片描述

数学优化
在这里插入图片描述

🙊写在最后🙊

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

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值