【问题标题】:All pairs in an array that sum to 10 with average/best O(n) run-time complexity数组中的所有对总和为 10,平均/最佳 O(n) 运行时复杂度
【发布时间】:2016-12-07 06:56:32
【问题描述】:

我正在尝试使用 javascript 进行编码。

我正在使用地图并试图找到所有加到 10 的对。但是,这些对没有正确打印。有些对正在打印,有些则没有。

<script>
        function twoSum(nums, target_num) {

            if(nums.length<2){
                return;
            }

            var myMap = new Map();
            var i;
            var target, val; 


            for(val of nums){
                //New change added for the recommendation of a user below
                //This makes the answer a little better
                myMap.set(val,false);
                target = target_num - val;

                if(!myMap.has(target)){ 
                    myMap.set(val,target);            
                }

                else{             
                    console.log("[" + target + "," + val +"]");           
                }                           
            }
        }
    </script>

我的输入是 ([2,4,6,7,3,2,1,9,4,1,6,4],10) 我想要的输出是 [4,6], [4,6],[6,4], [6,4],[7,3], [1,9], [9,1], [4,6 ],[6,4] 所以基本上,所有的数字都是我应该考虑的索引。 但是,我得到的输出是:[4,6],[7,3],[1,9],[6,4],[9,1],[4,6],[6,4 ].

我不确定我到底做错了什么。如果您能告诉我哪里出错以及如何纠正自己,那将非常有帮助。 另外,我的目标是让运行时间为 O(n),您认为我的解决方案可以实现吗?

非常感谢您的帮助。

谢谢。

【问题讨论】:

  • 线性时间是不可能的,输出可以是二次方大,比如用[1,1,...,1,9,9,...,9]
  • 从示例输入中,您的代码从不将 6 和 9 存储到地图中,因此您无法获得 [6,4] 和 [9,1]
  • 我对哈希图没有太多经验,所以我不知道如何存储 [6,4] 和 [9,1]。另外,我真的不明白为什么我无法存储它们。你能详细说明一下吗?
  • 查看原始代码中 for 循环中的 if-else 语句。当它从地图中找到目标时,它只会打印该对并且当前 val 不会存储到地图中。当达到第一个 '6' 时,代码只打印 [4,6] 然后在数组中查找下一个值。但是,地图仍然包含 {2,4},因为 '6' 没有存储到地图中。如果你想获取所有的pair,你应该存储当前的val,不管它是否有pair。

标签: javascript algorithm hashmap


【解决方案1】:

试试这个:

function twoSum(nums, target_num) {

  if(nums.length<2){
    return;
  }

  var myMap = new Object();
  var target; 

  for (var i=0; i<nums.length; i++){
    if (myMap[nums[i]]){
      myMap[nums[i]].push(i);
    } else {
      myMap[nums[i]] = [i];
    }
  }

  for(var i=0; i<nums.length; i++){
    target = target_num - nums[i];

    if (myMap[target]){
      var indexes = myMap[target].filter(j => j > i);

      if (indexes.length > 0){
        console.log(
          myMap[target].filter(j => j > i)
                       .map(x => [nums[i],target])
        );
      }
    }                           
  }
}

console.log(twoSum([2,4,6,7,3,2,1,9,4,1,6,4],10))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2019-12-09
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多