当前位置: 首页 > 知识库问答 >
问题:

指定数组中的元素对,其和等于特定目标数

柯琛
2023-03-14

我正在进行JavaScript会话。在我的编码练习中找到此代码。我理解逻辑,但我没有得到这个map[nums[x]]条件。

function twoSum(nums, target_num) {  
    var map = [];  
    var indexnum = [];  

    for (var x = 0; x < nums.length; x++)  
    {  
        if (map[nums[x]] != null)  
        // what they meant by map[nums[x]]
        {  
            index = map[nums[x]];  
            indexnum[0] = index+1;  
            indexnum[1] = x+1;  
            break;  
        }  
        else  
        {  
            map[target_num - nums[x]] = x;  
        }  
    }  
    return indexnum;  
    }  
console.log(twoSum([10,20,10,40,50,60,70],50));

我试图从一个指定的数组中获取元素对,该数组的和等于一个特定的目标数。我已经写了下面的代码。

function arraypair(array,sum){
        for (i = 0;i < array.length;i++) {
            var first = array[i];
            for (j = i + 1;j < array.length;j++) {
                var second = array[j];

                if ((first + second) == sum) {
            alert('First: ' + first + ' Second ' + second + ' SUM ' + sum);
            console.log('First: ' + first + ' Second ' + second);
                }
            }

        }
}

var a = [2, 4, 3, 5, 6, -2, 4, 7, 8, 9];

arraypair(a,7);

有没有比上述两种解决方案更优化的方法?有人能解释第一种解决方案吗?这个条件到底指的是什么映射[nums[x]]?

共有3个答案

仉伟兆
2023-03-14
function twoSum(arr, S) {
 const sum = [];
  for(let i = 0; i< arr.length; i++) {
    for(let j = i+1;  j < arr.length; j++) {
      if(S == arr[i] + arr[j]) sum.push([arr[i],arr[j]])
    }
  }
 return sum
}

暴力不是解决问题的最佳方式,但它确实有效。

章岳
2023-03-14

您看到的map值是一个查找表,而twoSum方法实现了所谓的动态编程

在动态编程中,您存储计算的值,以后可以重复使用这些值来找到解决方案。

twoSum([10,20,40,50,60,70], 50)
//I removed one of the duplicate 10s to make the example simpler

值是10。我们的目标数字是50。当我在索引0中看到数字10时,我会记下,如果我在这个列表中找到一个40 (50 - 10 = 40),那么我可以在索引0中找到它的对。

所以在我们的地图上,40点对0。

值为40。我看了看地图,我的地图上看到我之前找到了一双40人的。

将返回0<这意味着我有一对40的,索引为0的
0和2配对。

现在有什么意义吗?

与解决方案中有两个嵌套循环不同,您可以存储以前计算的值。这将节省处理时间,但会在内存中浪费更多空间(因为查找表需要内存)

此外,由于您是用javascript编写的,因此您的地图可以是对象而不是数组。这也会使调试变得更容易;)

别开诚
2023-03-14

使用HashMap方法,使用时间复杂度近似O(n),下面是以下代码:

let twoSum = (array, sum) => {
    let hashMap = {},
      results = []

        for (let i = 0; i < array.length; i++){
            if (hashMap[array[i]]){
                results.push([hashMap[array[i]], array[i]])
            }else{
                hashMap[sum - array[i]] = array[i];
            }
          }
          return results;
    }
console.log(twoSum([10,20,10,40,50,60,70,30],50));

结果:

{[10, 40],[20, 30]}

我认为代码是不言而喻的,即使你想帮助理解它,也请告诉我。我很乐意为你解释。

希望有帮助。。

 类似资料:
  • 在Javascript中,还有其他有效的方法来实现此任务吗? 我尝试的身份是: 这里输出:

  • 问题内容: 给定一个数组,我们需要找到总和等于数字 X 的所有对。 例如: 问题答案: 解决方案1: 您可以检查每一对数字,并找到总和等于 X。 Java 代码: 解决方案2: 对数组进行排序 * 我们将维护两个索引,一个在开头(l=0),一个在结尾(r=n-1) * 迭代直到 l < r * 检查 arr[l] + arr[r] 是否等于 X * 如果是,则打印该对并执行 l , r– * 如果

  • 如果给定的和等于数组中任意两个元素的和,函数需要返回true;否则函数需要返回false。

  • 本文向大家介绍C#中数组的指定维中的元素总数,包括了C#中数组的指定维中的元素总数的使用技巧和注意事项,需要的朋友参考一下 要获取数组指定维度中的元素总数,代码如下- 示例 输出结果 这将产生以下输出- 现在让我们来看另一个示例- 示例 输出结果 这将产生以下输出-

  • 查找数组是指从数组中查询指定位置的元素,或者查询某元素在指定数组中的位置。使用 Arrays 类的 binarySearch() 方法可以实现数组的查找,该方法可使用二分搜索法来搜索指定数组,以获得指定对象,该方法返回要搜索元素的索引值。 binarySearch() 方法有多种重载形式来满足不同类型数组的查找需要,常用的重载形式有两种。 (1) 第一种形式如下: 其中,a 表示要搜索的数组,ke

  • 给定一个由N个元素组成的数组,找出数组的所有子集,其和等于目标值。 我已经看到了所有关于子集和的老问题,但没有一个对我有用。 输入的第一行包含数组的整数N大小 第二行包含由空格分隔的数组元素 目标和值 打印所有子数组(元素索引)。 我的代码对于小的输入工作得很好,但是对于N>150则需要很长的时间。有没有其他有效的算法可以做到这一点。请告诉我如何优化此代码以适应较大的输入。 这是我的代码 需要花费