【发布时间】:2016-09-22 03:42:54
【问题描述】:
我一直在研究二和问题:
给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。
并且对允许重复的变化感到困惑。如果有重复,为什么会出现问题?我们不能只返回副本的索引吗?
【问题讨论】:
-
您是否忘记提及重复变体是什么?
-
这个问题似乎更适合cs.stackexchange.com
我一直在研究二和问题:
给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。
并且对允许重复的变化感到困惑。如果有重复,为什么会出现问题?我们不能只返回副本的索引吗?
【问题讨论】:
为了向其他人澄清,“重复变化”正是您所期望的:数字可能在数组中重复。
如果您编写蛮力算法,这并不重要。
但通常的非暴力算法涉及将数字散列到它们的索引(即创建一个反向数组)。这样,给定目标T,检查T - Array[0]是否作为哈希键存在(在这种情况下,已找到解决方案),如果不存在,则继续T - Array[1],依此类推。
现在,如果所有数字都是唯一的,则上述方法有效。但是,如果数字可以重复,例如:
Array[] = {1, 3, 4, 4, 6, 8};
T = 8;
散列必须包含 4 的一对多映射。因此它涉及确保您不会意外地两次从同一元素创建总和,例如
Array[2] + Array[2]
【讨论】:
不允许重复,这应该可以工作
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
nums_l = len(nums);
for i in range(0,nums_l):
for j in range(0,nums_l):
if (nums[i] + nums[j] == target and i != j):
return [i,j];
可以对 if 语句进行轻微修改以允许重复。
【讨论】: