【问题标题】:Two Sum with duplicates两个有重复的总和
【发布时间】:2016-09-22 03:42:54
【问题描述】:

我一直在研究二和问题:

给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。

并且对允许重复的变化感到困惑。如果有重复,为什么会出现问题?我们不能只返回副本的索引吗?

【问题讨论】:

标签: arrays list sum


【解决方案1】:

为了向其他人澄清,“重复变化”正是您所期望的:数字可能在数组中重复。

如果您编写蛮力算法,这并不重要。

但通常的非暴力算法涉及将数字散列到它们的索引(创建一个反向数组)。这样,给定目标T,检查T - Array[0]是否作为哈希键存在(在这种情况下,已找到解决方案),如果不存在,则继续T - Array[1],依此类推。

现在,如果所有数字都是唯一的,则上述方法有效。但是,如果数字可以重复,例如:

Array[] = {1, 3, 4, 4, 6, 8};
T = 8;

散列必须包含 4 的一对多映射。因此它涉及确保您不会意外地两次从同一元素创建总和,例如

Array[2] + Array[2]

【讨论】:

  • 这里是对该问题的一个很好的概述,web.stanford.edu/class/cs9/lectures/06/TwoSum.pdf,以另一种方式解释这一点,以防我的解释不够充分。
  • 但是提供的解决方案似乎没有考虑到重复。它仍然是一个哈希映射/表。这意味着它只会覆盖以前的键。
  • 您可以将键设为数字,将值设为您看到的次数。
【解决方案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 语句进行轻微修改以允许重复。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多