【问题标题】:TWO SUM Question- Python. Please explain the solution, makes no sense to me两个总和问题 - Python。请解释解决方案,对我来说没有意义
【发布时间】:2020-04-09 23:57:08
【问题描述】:

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

您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素

例子:

给定 nums = [2, 7, 11, 15],目标 = 9,

因为 nums[0] + nums[1] = 2 + 7 = 9, 返回 [0, 1]。

解决办法:

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        h = {}
        for i, num in enumerate(nums):
            n = target - num
            if n not in h:
                h[num] = i
            else:
                return [h[n], i]

这对我来说毫无意义,请有人解释一下它是如何工作的?

【问题讨论】:

  • 注意输入是 nums = [2, 7, 11, 15], target = 9,
  • 使用步进调试器跟踪代码执行可能有助于您理解。

标签: python


【解决方案1】:

我将用一个 C++ 程序来解释。和它很像。

取一个数组'arr',其大小(N) 等于'nums' 中的最大元素。这是15。但是,索引从 0 开始,因此我们将考虑 N = 16。用 0 初始化每个元素。

现在,将 'nums' 从 0 迭代到 'nums' 数组的长度,并用 1 更新 'arr' 的位置.

for(int k = 0; k < nums_length; k++) {
    arr[num[k]] = 1;
}

现在将 'arr'0 迭代到 N。在 'arr'1 的位置,即如果我们有来自 'nums' 的有效元素,检查是否还存在互补元素或不是。

例如,说 i = 0,然后 arr[num[0]] = arr[2]。在 'arr' 中,我们有 2,即 2'nums' 数组中的有效条目。现在,找到互补的,即 target - 29 - 2 = 7。现在检查 7 是否是 'nums' 数组中的有效条目。我们看到 arr[7] == 1。这意味着,7 存在。

我们现在需要找到7的索引。因此,将其存储在一个变量中并迭代 'nums' 数组以找到它的索引。

sn-p的代码是这样的:

for(int i = 0; i < N; i++) {
    if(arr[num[i]] == 1) {
        complement = abs(target - num[i]);
        if(arr[complement] == 1) {
            x = i;
            break;
        }
    }
}         
for(int j = 0; j < N; j++) {
    if(arr[j] == complement) {
        y = j;
        break;    
    }            
}
cout << x << y;

【讨论】:

  • 对不起,我还没有完全理解这个过程
【解决方案2】:

您正在询问列表中的每个数字“是否已经存在我要添加到我以等于目标的数字?”。 如果有,您将在 'i' 索引中找到当前数字,在 h[number_that_results_in_number_+_current_number_equals_target] 中,您将获得该数字的索引。

H 告诉您需要将哪个数字与该数字的多个索引相加。 所以:

  • 我有 2,9-2 是 7。

    h 中有 7 吗? (为什么是 7?因为只有 7 我可以使用 2 来产生 9 的总和。)不,放 2 和它的索引(例如,'2' 的索引是 0)。 (我没有放 7,因为我根本不知道列表中是否有 7。我所知道的,位置上有 2 列表中的 0 个。)

    现在我有 7 个。

    9-7 是 2。对我来说 (7) 我需要知道,之前列表中是否有 2。如果有,在哪里?

    h 中有 2 吗?

    是的,有,它有索引0,我的索引(7)是1。>> return [0, 1]

不确定这是否有帮助。

编辑: 这是两个处理后的数字(2 和 7)后变量的样子:

i   0
num 2
n   7
h {2: 0}
i   1
num 7
n   2
[0, 1(thats i for 7)]

编辑2: 想象一下,我们在 nums [2, 11, 15, 7] 中有不同的顺序:

i   0
num 2
n   7             # is value 7 in h? no, add current number and its index == 2: 0
h {2: 0}
--------------- # iteration of loop 
i   1
num 11
n   -2            # is value -2 in h? no, add current number and its index
h {2: 0, 11: 1(that is i for 11)}
---------------
i   2
num 15
n   -6            # is value -6 in h? no, add current value and its index
h {2: 0, 11: 1, 15: 2}
---------------
i   3
num 7
n   2             # is value 2 in h? yes, its index is 0, see h {2: 0...
returned value [0 (thats i for 2), 3 (thats i for 7)]

为什么我们要求“h 中的值是 -2”来表示值 11?因为只有 -2 我们才能从值 11 中得到总和 9。(其他人也一样。)

【讨论】:

  • 等一下,在第一次迭代中,我们将元素 0 放在数组 idex 3 对吗?然后在下一次迭代中, 2 不在列表中!只有0是
  • 不,在第一次迭代中,我们将数字 2 作为键并将其索引作为值。请参阅对我的答案的编辑。我们现在需要知道我们已经通过了哪些数字以及它们的索引是什么。我猜我们可以通过再次查询“nums”来获得他们的索引,但这会很痛苦而且没有必要,我们知道我们在每个步骤中处理的是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2011-04-13
  • 2020-09-04
相关资源
最近更新 更多