我是Python的新手,刚刚开始尝试LeetCode来构建我的排骨。在这个经典问题上,我的代码错过了一个测试用例。
问题如下:
给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。
您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
示例:
给出数字= [2,7,11,15],目标= 9,
因为nums [0] + nums [1] = 2 + 7 = 9, 返回[0,1]。
我错过了目标编号为6的测试用例[3,2,4],它应该返回索引[1,2],但是在目标编号为测试用例[1,5,7]的情况下6(当然会返回索引[0,1]),因此在while循环中似乎出现了问题,但是我不太确定是什么。
class Solution:
def twoSum(self, nums, target):
x = 0
y = len(nums) - 1
while x < y:
if nums[x] + nums[y] == target:
return (x, y)
if nums[x] + nums[y] < target:
x += 1
else:
y -= 1
self.x = x
self.y = y
self.array = array
return None
test_case = Solution()
array = [1, 5, 7]
print(test_case.twoSum(array, 6))
在目标为6的测试用例[3,2,4]上,输出返回null,因此甚至没有汇总索引1和2,我可以为y分配错误吗?
答案 0 :(得分:2)
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
ls=[]
l2=[]
for i in nums:
ls.append(target-i)
for i in range(len(ls)):
if ls[i] in nums :
if i!= nums.index(ls[i]):
l2.append([i,nums.index(ls[i])])
return l2[0]
x= Solution()
x.twoSum([-1,-2,-3,-4,-5],-8)
输出
[2, 4]
答案 1 :(得分:1)
方法不同。我们将根据需要构建一个值字典,该字典由我们要查找的值构成键;如果我们寻找一个值,则在该值首次出现时会对其进行索引。一旦找到满足问题的值,就可以完成。时间也是O(N)
class Solution:
def twoSum(self, nums, target):
look_for = {}
for n,x in enumerate(nums):
try:
return look_for[x], n
except KeyError:
look_for.setdefault(target - x,n)
test_case = Solution()
array = [1, 5, 7]
array2 = [3,2,4]
given_nums=[2,7,11,15]
print(test_case.twoSum(array, 6))
print(test_case.twoSum(array2, 6))
print(test_case.twoSum(given_nums,9))
输出:
(0, 1)
(1, 2)
(0, 1)
答案 2 :(得分:1)
一种蛮力的解决方案是将一个循环双重嵌套在列表上,其中内部循环仅查看比外部循环当前所在的索引大的索引。
class Solution:
def twoSum(self, nums, target):
for i, a in enumerate(nums, start=0):
for j, b in enumerate(nums[i+1:], start=0):
if a+b==target:
return [i, j+i+1]
test_case = Solution()
array = [3, 2, 4]
print(test_case.twoSum(array, 6))
array = [1, 5, 7]
print(test_case.twoSum(array, 6))
array = [2, 7, 11, 15]
print(test_case.twoSum(array, 9))
输出:
[1, 2]
[0, 1]
[0, 1]
答案 3 :(得分:0)
import itertools
class Solution:
def twoSum(self, nums, target):
subsets = []
for L in range(0, len(nums)+1):
for subset in itertools.combinations(nums, L):
if len(subset)!=0:
subsets.append(subset)
print(subsets) #returns all the posible combinations as tuples, note not permutations!
#sums all the tuples
sums = [sum(tup) for tup in subsets]
indexes = []
#Checks sum of all the posible combinations
if target in sums:
i = sums.index(target)
matching_combination = subsets[i] #gets the option
for number in matching_combination:
indexes.append(nums.index(number))
return indexes
else:
return None
test_case = Solution()
array = [1,2,3]
print(test_case.twoSum(array, 4))
我正在尝试用您的榜样进行自己的学习。我对发现的结果感到满意。我用itertools
为我组合了所有数字。然后,我使用列表操作对输入数组中所有可能的数字组合求和,然后仅检查一次目标是否在求和数组中。如果不是,则返回None,否则返回索引。请注意,如果将这三个索引加到目标中,则该方法也会返回所有三个索引。抱歉,花了这么长时间:)
答案 4 :(得分:0)
即使是较短的代码,这也是更全面的内聚效率代码。
nums = [6, 7, 11, 15, 3, 6, 5, 3,99,5,4,7,2]
target = 27
n = 0
for i in range(len(nums)):
n+=1
if n == len(nums):
n == len(nums)
else:
if nums[i]+nums[n] == target:
# to find the target position
print([nums.index(nums[i]),nums.index(nums[n])])
# to get the actual numbers to add print([nums[i],nums[n]])