Как сделать эту жадную функцию быстрее?

#python #time-complexity #greedy

#python #сложность по времени #жадный

Вопрос:

Я пытаюсь решить проблему, и мой код завершается с ошибкой в одном тестовом примере, где список имеет длину 25000. Есть ли какой-нибудь способ сделать это быстрее. Я пытался использовать functools.lru_cache , и я все еще не могу выполнить в течение времени, необходимого для завершения.

Это проблема с сайта

Учитывая массив неотрицательных целых чисел nums, вы изначально располагаетесь по первому индексу массива.

Каждый элемент в массиве представляет вашу максимальную длину перехода в этой позиции.

Определите, можете ли вы достичь последнего индекса.

Это то, что я пробовал

 def can_jump(input_list):

    @lru_cache
    def helper(idx = 0):
        if idx == len(input_list) - 1:
            return True
        return any(helper(new_idx) for x in range(input_list[idx]) 
        if (new_idx := idx   x   1) < len(input_list)) # increasing order of jumps

    return helper()
 

Примеры работы с тестовыми примерами

 input_list = [2,3,1,1,4]
print(can_jump(input_list)) # True
input_list = [3,2,1,0,4]
print(can_jump(input_list)) # False
 

Я также попытался пойти в другом направлении,

 return any(helper(new_idx) for x in range(input_list[idx], 0, -1) 
if (new_idx := idx   x) < len(input_list)) # decreasing order of jumps
 

Но я все еще не могу заставить это работать достаточно быстро, чтобы очистить последний тестовый пример списка элементов 25000, что я здесь делаю не так?

Комментарии:

1. Что такое сайт? Это может помочь, если мы сможем определить целевое время выполнения. Даже если мы могли бы оптимизировать ее, она все равно может быть недостаточно быстрой.

2. Это из leetcode @zerecees

3. Ах, хорошо, подожди, дай мне посмотреть, что я могу найти.

4. Ниже опубликован ответ из другого обмена стеками. Дайте мне знать, если у вас есть вопросы.

Ответ №1:

Хорошо, я думаю, я понял. Можете ли вы попробовать это? Пожалуйста, обратите внимание, это взято прямо из: https://codereview.stackexchange.com/questions/223612/jump-game-leetcode

 def canjump(nums):
    maximum_reachable_index = 0

    for index, max_jump in enumerate(nums):
        if index > maximum_reachable_index:
            return False

        maximum_reachable_index = max(index   max_jump, maximum_reachable_index)

    return True
 

Комментарии:

1. Поскольку ответ находится в другом стеке, я не пометил его как дубликат. Однако в будущем она может быть помечена как дублирующая, поскольку кто-то другой, возможно, задал вопрос по-другому.

2. хорошо, я попробую это, спасибо, тогда я не должен отмечать это как ответ?

3. Нет проблем, пожалуйста. И добро пожаловать в Stack! Принятие ответа зависит от вас. Если это сработает, я бы сказал, да. Я немного поискал в Google и не смог найти запрос, отправленный в stack overflow. Итак, похоже, что вопрос уникален, по крайней мере, при переполнении стека. Если вы принимаете это, я получаю интернет-очки (ура). Если вы этого не сделаете, это тоже хорошо (ура, потому что, надеюсь, это помогло).