【面试-leetcode172】相交链表(数学规律+递归)

49 阅读1分钟

freysteinn-g-jonsson-s94zCnADcUs-unsplash.jpg 这是 leetcode 面试刷题一题多解系列的第14篇,阶乘后的零是一道比较简单的找规律算法题目。

题目

阶乘后的零

来源:力扣(LeetCode) 链接:leetcode.cn/problems/fa…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:数学规律

我们可以先找找规律,当一个数阶乘后,末尾的0来自于10的质因数分解的次数,10又可以分解为2和5,因此我们只需要数一下阶乘中有多少对2和5就行了。但是,由于2的个数一定比5多,所以我们只需要数一下阶乘中有多少个5即可。例如,10!中5的倍数有2个,15的倍数有1个,20的倍数有1个,25的倍数有1个,总共有5个5,所以10!末尾有2个0。

时间复杂度:O(logn)

空间复杂度:O(1)

var trailingZeroes = function(n) {
    let count = 0;
    while(n > 0) {
        count += Math.floor(n / 5);
        n = Math.floor(n / 5);
    }
    return count;
};

解法二:递归

由于阶乘中因数5的个数决定了结尾0的个数,因此我们可以递归地计算因数5的个数。

具体来说,对于一个数 n,它所包含的因数5的个数为 n/5 + n/25 + n/125 + ...,其中每个数相当于除以5的指数幂。

时间复杂度:O(logn)

空间复杂度:O(logn),其中空间复杂度为递归栈的深度,即调用次数。

function trailingZeroes(n) {
  if (n === 0) {
    return 0;
  }
  return Math.floor(n / 5) + trailingZeroes(Math.floor(n / 5));
}

我的更多前端资讯

欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接