📖本篇内容: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 为 以内,如果 n 给定的数值是足够大的话
,那么很大情况这道题会超时
,因为按照上述的方法做出来其时间复杂度为 ,如果给定的 n 为 这题绝对会TLE
,所以官方放我们设计一个时间复杂度为 的算法来处理,我们接着来看,如何对上述的代码进行优化,我们本质是为了求每个数中 5 的个数,那么如果数等于 25 时
,里面就是有 2 个 5
,那么以此类推
就能知道125 = 5*5*5
那么每当125个数字时就是要+3个5
所以总共 5 的个数是 剩下的就交给程序计算即可。
⭐代码实现⭐
暴力数学
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()
- 空间复杂度: O()
数学优化
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()
- 空间复杂度: O()
运行结果
暴力数学
数学优化
🙊写在最后🙊
2022- 3- 25今天小付打卡了哦~
美好的日出 美好的山河
都因有你存在 而璀璨 耀眼