阶乘尾随零BigO问题

时间:2018-05-28 11:07:40

标签: algorithm big-o factorial trailing

当我提交leetcode时,它运行案例500/502但失败了,原因:1808548329.但是当我在自己的mac上运行它时,它给出的答案与接受的答案相同。

我的代码:

int trailingZeroes(int n) {
    int count = 0;
    int tmp = 0; //check every number in [1, i]
    for (int i = 1; i <= n; i++) {
        tmp = i;
        while (tmp % 5 == 0) {
            count++;
            tmp /= 5;
        }
    }
    return count;
}

和回答:

int trailingZeroes2(int n) {
    return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
}

他们在我的mac上运行相同的结果:

std::cout << trailingZeroes(1808548329) << std::endl; //452137076
std::cout << trailingZeroes2(1808548329) << std::endl; //452137076

是因为time complexity?而未接受第一个解决方案的原因 (cus'我在我自己的Mac上运行它,但它给出了与ac相同的答案)

如何计算第一个解决方案的时间复杂度,

O(NlogN)吗?我不确定。你帮我一个忙吗?: - )

编辑,删除图片。

1 个答案:

答案 0 :(得分:1)

您的解决方案是O(n)

  • 内部循环每5个项目至少重复一次
  • 内部循环每25个项目重复至少两次
  • ...
  • 内部循环每5 ^ k项重复至少k次。

将它们加在一起可以得到内循环:

n/5 + n/25 + n/125 + ... + 1 = 
n (1/5 + 1/25 + 1/125 + ... + 1/n)

这是sum of geometric series,位于O(n)

此外,如果忽略内部循环,外部循环本身具有O(n)次迭代,每次成本都是恒定的,所以这仍然是O(n)

然而,替代解决方案在O(logn)中运行,效率明显提高。