Javascript twoSum算法:给定整数数组,返回两个数字的索引,以使它们加起来成为一个特定的目标

时间:2019-08-18 12:53:23

标签: javascript arrays algorithm

  

给出一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标。

     

示例:

     

给出数字= [3, 2, 4],目标= 6,

     

因为nums[1] + nums[2] = 2 + 4 = 6

     

return [1, 2]

解决方案

var twoSum = function(nums, target) {
    for(let i = 0; i <= nums.length; i++){
        for(let j = 0; j <= nums.length; j++){
            if(nums[i] + nums[j] == target){
                return [i, j]
            }
        }
    }
};

上面的代码在其他情况下有效,但在这种情况下无效。

预期结果 [1,2]

输出 [0,0]

例如,我尝试使用不同的数字数组和不同的目标,即使您更改数字的顺序也可以使用

示例:

新数组:[15, 7, 11, 2],目标= 9,

输出: [1, 3]

我不了解解决方案出了什么问题,希望有人可以解释。谢谢

7 个答案:

答案 0 :(得分:2)

您可以使用一种非常简单的技术。
基本上,您可以检查当前迭代中目标和元素的差异是否存在于数组中。

假设同一个索引不能重复使用

nums = [3, 2, 4], target = 6
nums[0] = 3
target = 6
diff = 6 - 3 = 3
nums.indexOf[3] = 0 // FAILURE case because it's the same index

// move to next iteration
nums[1] = 2
target = 6
diff = 6 - 2 = 4
nums.indexOf(4) = 2 // SUCCESS '4' exists in the array nums
// break the loop

这是 leetcode 接受的答案。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    for (let index = 0; index < nums.length; index++) {
        const diff = target - nums[index];
        const diffIndex = nums.indexOf(diff);
        // "diffIndex !== index" takes care of same index not being reused
        if (diffIndex !== -1 && diffIndex !== index) {
            return [index, diffIndex];
        }
    }
};

运行时间:72 毫秒,比两个 Sum 的 93.74% 的 JavaScript 在线提交快。
内存使用:38.5 MB,不到两和的 JavaScript 在线提交的 90.55%。

谁能帮我减少内存使用量?

答案 1 :(得分:1)

  

我不知道解决方案出了什么问题,我希望   有人可以解释吗?

在这里,内循环和外循环都是从0 th 开始的,因此在[3,2,4] and target 6的情况下,它将以[0,0]的形式返回3 + 3等于目标,因此要照顾到同一索引元素不被使用两次,会在外循环和内循环之间产生1差异


使外部循环从0 th 索引开始,内部循环从值i+1

开始

var twoSum = function(nums, target) {
    for(let i = 0; i < nums.length; i++){
        for(let j = i+1; j < nums.length; j++){
            if(nums[i] + nums[j] == target){
                return [i, j]
            }
        }
    }
};

console.log(twoSum([15, 7, 11, 2],9))
console.log(twoSum([3, 2, 4],6))

答案 2 :(得分:0)

您的解决方案按预期工作。对于nums = [3, 2 ,4]target = 6[0, 0]是概述问题nums[0] + nums[0] = 3 + 3 = 6的有效解决方案。

如果您需要两个不同的索引(根据我的理解,任务不需要这样做),则可以添加其他不等式检查(nums[i] + nums[j] == target && i != j)。

答案 3 :(得分:0)

var twoSum = function (nums, target) {
var len = nums.length;
for (var i = 0; i < len; i++) {
    for (var j = i + 1; j < len; j++) {
        if (nums[i] + nums[j] == target) {
            return [i,j];
        }
    }
  }
};

答案 4 :(得分:0)

var twoSum = function(nums, target) {
    for(var i=0;i<nums.length;i++){
        for(var j=i+1;j<nums.length;j++){
        temp = nums[i]+nums[j];
        if(temp == target){
            return [i,j]
        }
      }
    }
    
};


console.log(twoSum([15, 7, 11, 2],9))
console.log(twoSum([3, 2, 4],6))
console.log(twoSum([3,3],6))

这完美运行,运行时间:比 84 毫秒少 72 毫秒

答案 5 :(得分:0)

另一种解决时间复杂度为 O(n) 的问题的有效方法是不使用嵌套循环。我评论了步骤,让JS开发者容易理解。这是我使用 golang 的解决方案:

func twoSum(intArray []int, target int) []int {
    response := []int{-1, -1}  // create an array as default response

    if len(intArray) == 0 {  // return default response if the input array is empty
        return response
    }

    listMap := map[int]int{} // create a Map, JS => listMap = new Map()

    for index, value := range intArray { // for loop to fill the map
        listMap[value] = index
    }

    for i, value := range intArray { // for loop to verify if the subtraction is in the map
        result := target - value
        if j, ok := listMap[result]; ok && i != j { // this verify if a property exists on a map in golang. In the same line we verify it i == j.
            response[0] = i
            response[1] = j
            return response
        }
    }

    return response
}

答案 6 :(得分:-1)

var twoSum = function(nums, target) {
    
   for(let i=0; i<nums.length; i++){
       for(let j=i+1; j<nums.length; j++){
           if(nums[j] === target - nums[i]){
              return [i, j];
           }
       }
   }
};