二和Leetcode解释,Hashmap,Javascript

二和Leetcode解释,Hashmap,Javascript,javascript,algorithm,hashmap,Javascript,Algorithm,Hashmap,我只是想知道谁能一步一步地解释这个解决方案的算法。我不知道hashmap是如何工作的。你能不能给我一个使用hashmap的基本例子,让我理解这个算法。谢谢大家! var twoSum = function(nums, target) { let hash = {}; for(let i = 0; i < nums.length; i++) { const n = nums[i]; if(hash[target - n] !== undefined) {

我只是想知道谁能一步一步地解释这个解决方案的算法。我不知道hashmap是如何工作的。你能不能给我一个使用hashmap的基本例子,让我理解这个算法。谢谢大家!

var twoSum = function(nums, target) {
  let hash = {};

  for(let i = 0; i < nums.length; i++) {
    const n = nums[i];
    if(hash[target - n] !== undefined) {
      return [hash[target - n], i];
    }
    hash[n] = i;
  }
  return [];
}

您的代码接受一个数字数组和一个目标数字/和。然后,它返回数组中两个数字的索引,这两个数字加起来就是目标数字/总和

考虑一个数字数组,例如[1,2,3],目标为5。您的任务是查找此数组中的两个数字,它们相加为5。解决这个问题的一种方法是循环数组中的每个数字,然后问自己是否有一个我在数组中已经看到的数字,我可以将其添加到当前数字中以获得我的目标和

好的,如果我们在[1,2,3]的示例数组上循环,我们首先从索引0开始,编号为1。目前,没有我们已经看到的数字,我们可以加上1,以达到我们的目标5,因为我们还没有循环过任何数字

到目前为止,我们遇到了数字1,它位于索引0处。它以{'1':0}的形式存储在hashmap ie对象中。其中键是数字,值0是它所在的索引。对象的目的是存储我们看到的数字以及它们出现的索引

接下来,循环继续索引1,当前编号为2。我们现在可以问自己这样一个问题:在我的数组中是否有一个我已经看到的数字,我可以将其添加到我当前的数字2中,以获得目标和5。要达到目标,需要添加到当前编号中的金额可以通过执行target currentNumber获得。在本例中,我们目前是2,因此我们需要添加3以获得5的目标和。使用hashmap/object,我们可以检查是否已经看到了数字3。为此,我们可以通过执行obj[target currentNumber]尝试访问object 3键。目前,我们的对象只有“1”键,因此当我们尝试访问3键时,您将无法定义。这意味着我们还没有看到数字3,因此,到目前为止,没有任何东西可以添加到2来获得我们的目标总和

现在我们的object/hashmap看起来像{'1':0,'2':1},我们已经看到了索引0处的数字1,以及索引1处的数字2

最后,我们到达数组中的最后一个数字,即索引2。数组的索引2包含数字3。现在,我们再次问自己一个问题:是否有一个我们已经看到的数字,我们可以将其添加到我们当前的数字3中,以获得目标总和?。我们需要加在3上的数字是2,通过执行target currentNumber获得目标数5。现在我们可以检查对象,看看是否已经在数组中看到了数字2。为此,我们可以使用obj[target currentNumber]获取存储在键2上的值,该键存储索引1。这意味着数组中确实存在数字2,因此我们可以将其添加到3以达到目标。由于值在对象中,我们现在可以返回我们的结果。这是看到的数字出现的位置的索引,以及当前数字的索引

通常,该对象用于跟踪数组中以前看到的所有数字,并保留在其中看到该数字的索引值

下面是一个运行代码的示例。它返回[1,2],因为索引1和2处的数字可以相加,得到目标和5:

const twoSum=函数nums,目标{ const hash={};//存储看到的数字:{seenNumber:indexit} 对于let i=0;iconsole.logtwoSum[1,2,3],5;//[1,2]您的代码接受一个数字数组和一个目标数字/和。然后,它返回数组中两个数字的索引,这两个数字加起来就是目标数字/总和

考虑一个数字数组,例如[1,2,3],目标为5。您的任务是查找此数组中的两个数字,它们相加为5。解决这个问题的一种方法是循环数组中的每个数字,然后问自己是否有一个我在数组中已经看到的数字,我可以将其添加到当前数字中以获得我的目标和

好的,如果我们在[1,2,3]的示例数组上循环,我们首先从索引0开始,编号为1。目前,没有我们已经看到的数字,我们可以加上1,以达到我们的目标5,因为我们还没有循环过任何数字

到目前为止,我们遇到了第一个 s在索引0处。它以{'1':0}的形式存储在hashmap ie对象中。其中键是数字,值0是它所在的索引。对象的目的是存储我们看到的数字以及它们出现的索引

接下来,循环继续索引1,当前编号为2。我们现在可以问自己这样一个问题:在我的数组中是否有一个我已经看到的数字,我可以将其添加到我当前的数字2中,以获得目标和5。要达到目标,需要添加到当前编号中的金额可以通过执行target currentNumber获得。在本例中,我们目前是2,因此我们需要添加3以获得5的目标和。使用hashmap/object,我们可以检查是否已经看到了数字3。为此,我们可以通过执行obj[target currentNumber]尝试访问object 3键。目前,我们的对象只有“1”键,因此当我们尝试访问3键时,您将无法定义。这意味着我们还没有看到数字3,因此,到目前为止,没有任何东西可以添加到2来获得我们的目标总和

现在我们的object/hashmap看起来像{'1':0,'2':1},我们已经看到了索引0处的数字1,以及索引1处的数字2

最后,我们到达数组中的最后一个数字,即索引2。数组的索引2包含数字3。现在,我们再次问自己一个问题:是否有一个我们已经看到的数字,我们可以将其添加到我们当前的数字3中,以获得目标总和?。我们需要加在3上的数字是2,通过执行target currentNumber获得目标数5。现在我们可以检查对象,看看是否已经在数组中看到了数字2。为此,我们可以使用obj[target currentNumber]获取存储在键2上的值,该键存储索引1。这意味着数组中确实存在数字2,因此我们可以将其添加到3以达到目标。由于值在对象中,我们现在可以返回我们的结果。这是看到的数字出现的位置的索引,以及当前数字的索引

通常,该对象用于跟踪数组中以前看到的所有数字,并保留在其中看到该数字的索引值

下面是一个运行代码的示例。它返回[1,2],因为索引1和2处的数字可以相加,得到目标和5:

const twoSum=函数nums,目标{ const hash={};//存储看到的数字:{seenNumber:indexit} 对于let i=0;iconsole.logtwoSum[1,2,3],5;//[1,2]散列映射只是js中的一个简单的键值存储或对象。这里没有什么特别的地方,只需获取示例输入,并逐行检查代码。哈希映射只是js中的一个简单的键值存储或对象。这里没有什么特别的事情发生,获取样本输入并逐行检查代码。有点明白了。但是除了这个二和问题,还有其他的例子使用他的Hashmap让我完全理解它吗?任何基本的examples@JamesA您好,我添加了一些关于对象的详细信息和一个示例,您可以使用一个对象来计算阵列中事物的频率谢谢,先生。在这个freq示例中,我得到了这个,它类似于直方图,用于跟踪数组中有多少个字母。但是,我对这个leetcode示例使用hashmap/obj返回2个值的理解有点困惑。@JamesA leetcode使用数组返回2个值。它将数组中的第一项设置为需要与当前数字相加以达到目标和的数字的索引。数组中的第二个值是当前数字的索引。因此,这为我们提供了一个由两个数字组成的数组,表示原始数组中两个数字的索引,当两个数字相加时,将为我们提供目标和。@Mikibelasta谢谢:当没有两个数字可以相加以等于目标和时,代码返回一个空数组[]。由于return[]出现在for循环之后,因此只有在对数组中的每个数字进行循环后,它才会返回空数组。如果我们碰巧在循环的前面找到两个加在一起等于目标和的有效数字,我们将返回[hash[target-n],i],而不是空数组。返回一个空数组只是一种表示可以将两个数字相加以到达目标的方法。有点像得到它。但是除了这个二和问题,还有其他的例子吗
他的Hashmap能让我完全理解吗?任何基本的examples@JamesA您好,我添加了一些关于对象的详细信息和一个示例,您可以使用一个对象来计算阵列中事物的频率谢谢,先生。在这个freq示例中,我得到了这个,它类似于直方图,用于跟踪数组中有多少个字母。但是,我对这个leetcode示例使用hashmap/obj返回2个值的理解有点困惑。@JamesA leetcode使用数组返回2个值。它将数组中的第一项设置为需要与当前数字相加以达到目标和的数字的索引。数组中的第二个值是当前数字的索引。因此,这为我们提供了一个由两个数字组成的数组,表示原始数组中两个数字的索引,当两个数字相加时,将为我们提供目标和。@Mikibelasta谢谢:当没有两个数字可以相加以等于目标和时,代码返回一个空数组[]。由于return[]出现在for循环之后,因此只有在对数组中的每个数字进行循环后,它才会返回空数组。如果我们碰巧在循环的前面找到两个加在一起等于目标和的有效数字,我们将返回[hash[target-n],i],而不是空数组。返回一个空数组只是表明可以添加两个数字以达到目标的一种方式。