python 3的解决方案是什么?
****给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。 您可以假设每个输入都只有一个解决方案,并且您可能不会使用相同的元素两次。``
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
答案 0 :(得分:1)
使用outermost(//div)
将列表中的元素组合成非重复的夫妻,并检查总和是否匹配。如果是,请打印条款的位置:
itertools.combinations
答案 1 :(得分:0)
此函数遍历列表中的所有数字,并查找与其他数字的总和。如果总和等于目标,则返回索引
def indices_sum(nums,target):
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j] == target: return(i,j)
答案 2 :(得分:0)
这个问题有两个部分:
检索其索引值
def get_index_for_target(nums,target):
for x in nums:
for y in nums:
if x + y == target:
return (nums.index(x), nums.index(y))
答案 3 :(得分:0)
测试所有可能的耦合(使用叠加循环或itertools.combinations
)的解决方案的主要问题是O(n ^ 2),因为您基本上测试了n中两个元素的所有可能组合(有n个) *(n-1)/ 2个此类组合),直到找到有效的。
当n很大时,您需要一个更有效的算法。一种可能性是首先对列表进行排序(这是O(n * log(n))),找到解决方案然后可以直接在O(n)中完成,这为O(n * log(n)提供了解决方案)。
我们首先对列表进行排序,然后添加第一个(最小)和最后(最大)值。如果总和太大,我们可以删除最大值。如果它太小,我们会移除最小的一个,直到达到确切的总和。
我们可以使用collection.deque有效删除列表任意一端的值。
为了检索索引,我们将它们保留在元组中的值之外。
from collections import deque
def find_target(values, target):
dq = deque(sorted([(val, idx) for idx, val in enumerate(values)]))
while True:
if len(dq) < 2:
raise ValueError('No match found')
s = dq[0][0] + dq[-1][0]
if s > target:
dq.pop()
elif s < target:
dq.popleft()
else:
break
return dq[0], dq[-1]
values = [23, 5, 55, 11, 2, 12, 26, 16]
target = 27
sol = find_target(values, target)
print(sol)
# ((11, 3), (16, 7))
# 11 + 16 == 27, indices 3 and 7
print(sol[0][1], sol[1][1])
# 3 7
答案 4 :(得分:0)
对于列表中的每个条目,检查列表中是否有任何其他数字加到目标之后。由于a + b = target相当于b = target-a,你可以只取每个元素,查看该元素之后的所有数字,并检查它们是否是target - element。如果是,请返回索引。
for index,num in enumerate(nums):
if target-num in nums[index+1:]:
return(index, nums.index(target-num))
答案 5 :(得分:0)
我们可以在列表的开头和结尾处使用指针,通过两个数字的和检查每个索引,循环一次。
def sumOfTwo(array, target):
i = 0
j = len(array) - 1
while i < j:
add = array[i] + array[j]
if add == target:
return True
elif add < target:
i += 1
else:
j -= 1
return False
input -> [1, 2, 3, 4] -> target: 6
i-> <-j
[1][2][3][4] if i + j = target return True
if i + j < target increase i
else decrease j
注意: :在极少数情况下,循环前需要进行检查,以防万一:target为负值,列表为空,target为空。 / p>
答案 6 :(得分:0)
我们可以执行以下操作:
numbers = [2, 7, 11, 15]
target =9
for x in numbers:
for y in numbers:
if x+y==target:
print(x,y)