Как уменьшить время работы до менее 3 секунд? [closed]

def draft(ranking): #
    count = 0
    for i in range(0, len(ranking) - 2):
        for j in range(i+1, len(ranking) - 1):
            for k in range(j+1, len(ranking)):
                if ranking[i] <= ranking[j] and ranking[j] <= ranking[k]:
                    count += 1
    return count           
            
n = int(input())

for i in range(n):
    li = list(map(int,input().split(' ')))
    print(draft(li))

Мне поручено распечатать сумму всех возможных комбинаций команд из списка с ранжированием условий[i]

1 ответ
1

Вы можете добиться большего, чем $$ O (n ^ 3) $$ сложность у вас здесь. Вот более эффективный $$ O (n ^ 2) $$ алгоритм, который вы можете использовать:

  1. Возьмите все элементы вместе и пометьте их, чтобы вы могли определить, в каком списке они изначально находились.

  2. Сортировать список в $$ O (n log n) $$ время.

  3. Теперь мы можем просмотреть список слева направо. Предположим, у нас есть упорядоченный список с метками 1123221321. Тогда количество действительных троек можно рассчитать в $$ O (n ^ 2) $$ время, отмечая, что мы хотим все возможности иметь $$ (1, 2, 3) $$ чтобы. Итак, в этом примере:

2 * 1 * 2 +

2 * 2 * 1 +

1 * 1 * 0

где первый член означает, что мы берем одну из первых двух единиц, затем одну из следующего блока двоек и одну из двух оставшихся троек, вторая сумма берет одну из первых двух единиц, одну из второго блока двоек и один из оставшихся трех. Наконец, взяв 1 из второго блока из 1, 1 из единственного оставшегося блока из 2, и трех больше не осталось.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *