факториал замыкающих нулей проблемы BigO

когда я отправляю 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? (потому что я запускаю его на своем собственном Mac, но оно дает тот же ответ, что и AC)

как я могу рассчитать временную сложность первого решения,

это O(NlogN) ? Я не уверена. можешь оказать мне услугу? : -)


отредактировал, убери фотки.


person ch-yk    schedule 28.05.2018    source источник
comment
Замените изображения текстом. Всем становится легче.   -  person cadaniluk    schedule 28.05.2018
comment
извините, я здесь новичок, он сказал, что для публикации изображений нужно как минимум 10 репутаций .. я попробую позже, спасибо в любом случае.   -  person ch-yk    schedule 28.05.2018
comment
Не размещайте изображения. Вместо этого используйте текст. Скопируйте код из редактора в свой вопрос.   -  person cadaniluk    schedule 28.05.2018
comment
понял, стало лучше, спасибо.   -  person ch-yk    schedule 28.05.2018


Ответы (1)


Ваше решение O(n).

  • Внутренний цикл повторяется не реже одного раза каждые 5 элементов.
  • Внутренний цикл повторяется не менее двух раз через каждые 25 элементов.
  • ...
  • Внутренний цикл повторяется не менее k раз через каждые 5^k элементов.

Суммируя это вместе, вы получаете, что внутренний цикл работает:

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

Это сумма геометрического ряда, которая находится в O(n)

Кроме того, сам внешний цикл имеет O(n) итераций с постоянной стоимостью, если игнорировать внутренние циклы, так что остается O(n).


Однако альтернативное решение работает в O(logn), что значительно эффективнее.

person amit    schedule 28.05.2018
comment
Большой палец вверх к вам. Спасибо. :) - person ch-yk; 30.05.2018