На следующей неделе у меня будет задача по кодированию в качестве первого раунда собеседования. HR сказал, что они будут использовать Codility в качестве платформы для задач кодирования. Я практикуюсь по Урокам бодрствования.

Моя проблема в том, что я часто получаю очень высокие баллы за правильность, но моя оценка производительности, которая измеряет временную сложность, ужасна (я часто получаю 0%).

Вот вопрос: https://app.codility.com/programmers/lessons/5-prefix_sums / pass_cars /

Мой код:

def solution(A):
    N = len(A)
    my_list = []
    count = 0
    for i in range(N):
        if A[i] == 1:
            continue
        else:
            my_list = A[i + 1:]
            count = count + sum(my_list)
    print(count)
    return count

Предполагается, что это O (N), но у меня O (N ** 2).

  1. Как кто-то может подойти к этому вопросу, чтобы решить его при временной сложности O (N)?

  2. В общем, когда вы смотрите на вопрос об алгоритме, как вы можете найти подход?

1
Jun Jang 1 Янв 2018 в 01:21

2 ответа

Лучший ответ

Вы не должны суммировать весь массив каждый раз, когда найдете ноль. Это составляет O (n ^ 2). Вместо этого обратите внимание, что каждый найденный ноль даст +1 для каждого следующего:

def solution(A):
    zeros = 0
    passing = 0
    for i in A:
        if i == 0:
            zeros += 1
        else:
            passing += zeros
    return passing
6
Stephen Rauch 31 Дек 2017 в 22:55

Вы можете проверить все решения codility, а также пример проезжающих автомобилей.

Не забывайте лимит в 1000000000.

def solution(a):
    pc=0
    fz=0

    for e in a:
        if pc>1000000000:
            return -1
        if e==0:
            fz+=1
        else:
            pc+=fz           

    return pc
0
555 18 Мар 2020 в 12:17