#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]