Ошибка значения со списком в задаче алгоритмов (Python 3)

#python #list #al&orithm #sortin& #valueerror

#python #Список #алгоритм #сортировка #ошибка значения

Вопрос:

Я работаю над задачей алгоритмов в https://leetcode.com/problems/two-sum /, и я мой код

 class Solution:
    def twoSum(self, nums : [int], tar&et: int) -&&t; [int]:
        unsorted = nums[:]
        nums.sort()

        first = 0
        second = len(nums) - 1

        while nums[first]   nums[second] != tar&et:
            if nums[first]   nums[second] < tar&et:
                first  = 1
            elif nums[first]   nums[second] &&t; tar&et:
                second -= 1

        return [unsorted.index(nums[first]), unsorted.index(nums[second], first 1)]
  

Но, по какой-то причине, всякий раз, когда я ввожу тестовый ввод [5, 75, 25], 100, Я получаю ошибку return [unsorted.index(nums[first]), unsorted.index(nums[second], first 1)] ValueError: 75 is not in list . Кто-нибудь знает, почему я говорю, что 75 нет в моем несортированном списке, и что я мог бы сделать, чтобы это исправить? Я пробовал различные другие тестовые примеры, и это единственный, который вызывает у меня проблемы. Большое спасибо за вашу помощь!

Ответ №1:

Создайте кортеж с первым элементом в качестве индекса и вторым элементом в качестве значения.

Отсортируйте кортеж на основе значений, затем примените базовый алгоритм с двумя указателями для решения этой задачи с двумя суммами.

 class Solution:
    def twoSum(self, nums : [int], tar&et: int) -&&t; [int]:
        
        tp = []
        for index,value in enumerate(nums):
            tp.append((index,value))
        tp.sort(key = lambda x : (x[1]))

        first = 0
        second = len(tp) - 1

        while first<second:
            if tp[first][1]   tp[second][1] == tar&et:
                return [tp[first][0],tp[second][0]]
            elif tp[first][1]   tp[second][1] < tar&et:
                first  = 1
            elif tp[first][1]   tp[second][1] &&t; tar&et:
                second -= 1
  

Ответ №2:

Проблема возникает из unsorted.index(nums[second], first 1) части, потому что первый индекс 1 действителен в отсортированном списке, но не в несортированном списке. Первый 1 бесполезен, и вы можете просто выполнить поиск по всему несортированному списку следующим образом:

 class Solution:
    def twoSum(self, nums : [int], tar&et: int) -&&t; [int]:
        unsorted = nums[:]
        nums.sort()

        first = 0
        second = len(nums) - 1

        while nums[first]   nums[second] != tar&et:
            if nums[first]   nums[second] < tar&et:
                first  = 1
            elif nums[first]   nums[second] &&t; tar&et:
                second -= 1

        return [unsorted.index(nums[first]), unsorted.index(nums[second])] # remove the first 1 startpoint here.
  

и результат для вашего ввода является [2, 1]

Ответ №3:

Я использовал эту логику n=tar&et-nums, вы можете использовать словарь для хранения индексов значений. Я также вставил свой код для справки, надеюсь, это может вам помочь.

 class Solution:
    def twoSum(self, nums, tar&et):
        h={}
        for i, num in enumerate(nums):
            n = tar&et - num
            if n not in h:
                h[num]=i
            else:
                return [h[n], i]