Javascript两数之和算法:给定一个整数数组,返回两个数字的索引,使它们相加等于特定的目标值。

5
给定一个整数数组,返回两个数字的索引,使它们加起来等于特定目标。
示例:给定nums = [3,2,4],target = 6,因为nums[1] + nums[2] = 2 + 4 = 6,返回[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]

我不明白解决方案出了什么问题,希望有人能够解释。谢谢。


你所做的问题在于j是从0开始索引的。因此,它将考虑i处的任何元素两次。j应该始终为i+1。就你给出的例子而言,假设i=0且j=0,现在它将检查num[0]+num[0],即3+3,并返回0,0。但问题说明不能重复使用任何数字。因此,如果您将j设置为i+1,则以这种方式3+2!=6将导致下一个元素。 - Simran Dhingra
22个回答

0

我的解决方案:

  1. 创建一个Set
  2. 然后循环数组,检索目标数字减去数组中所有元素之间的所有差异。仅插入正数(因为是Set,不会包含重复项)。
  3. 然后再次迭代数组,现在只比较数组元素是否在集合中,如果是,则将i中的索引存储在索引数组中并返回它。
public static Object solution(int[] a, int target){
    Set<Integer> s = new HashSet<>();
    ArrayList<Integer> indexes = new ArrayList<Integer>();
    
    for (int e : a){
        Integer diff = new Integer(target - e);
        if(diff>0){
            s.add(diff);
        }
    }
    
    int i = 0;
    for (int e : a){
        if(s.contains(e)){
            indexes.add(i);
        }
        i++;
    }
    

    return indexes;
    
}

这并没有回答“所提供的解决方案有什么问题?” - greybeard

0
def twoSum(self, nums: List[int], target: int) -> List[int]:
    for i in range(len(nums)):
        comp = target - nums[i]
        if comp in nums:
            j = nums.index(comp)
                if(i!=j):
                    return [i,j]

1
请阅读如何撰写好的答案?。虽然这个代码块可能回答了OP的问题,但如果您解释一下这段代码与问题中的代码有何不同,您做了哪些更改,为什么要更改以及为什么这样解决问题而不会引入其他问题,那么这个答案将会更加有用。 - Saeed Zhiany
这并没有回答“所提供的解决方案有什么问题?”它没有使用JavaScript。 - greybeard

0
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        indx =[]
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[j]==(target-nums[i]):
                    indx.append(i)
                    indx.append(j)
                    return indx

你的答案可以通过添加更多的支持性信息进行改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关编写良好答案的更多信息。 - kedar sedai
这并没有回答“所提供的解决方案有什么问题?” - greybeard

0
function addNumber(num, target) {
   let arr = [];
   num.every((pv, pi) => {
      let diff = target - pv;
      let diffIdx = num.indexOf(diff);
      if (diffIdx !== -1 && diffIdx !== pi) {
          arr.push(pi,diffIdx)
          return false;
      }
      return true;
   });
    return arr;
  }

console.log(
    addNumber([4, 0, 1, 9, 7],4)
)

0
twoSummation = (numsArr, estTarget) => {
    for(let index = 0; index < numsArr.length; index++){
        for(let n = index+1; n < numsArr.length; n++){
            if(numsArr[index] + numsArr[n] == estTarget){
                return [index, n]
            }
        }
    }
}

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

这并没有回答“所提供的解决方案有什么问题?” - greybeard

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

2
目前你的回答不够清晰,请编辑并添加更多细节以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
这并没有回答“所提供的解决方案有什么问题?” - greybeard

0

我想这可能是一个更好的解决方案。与嵌套循环不同,这提供了一种线性解决方案。

(PS:indexOf也是具有O(n)复杂度的循环)

var twoSum = function (nums, target) {
    const hm = {}
    nums.forEach((num, i) => {
      hm[target - num] = i
    })

    for (let i = 0; i < nums.length; i++) {
      if(hm[nums[i]] !== undefined && hm[nums[i]] !== i) {
        return ([hm[nums[i]], i])
      }
    }
};

这并没有回答“所提供的解决方案有什么问题?” - greybeard

0

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))


这并没有回答“所提供的解决方案有什么问题?” - greybeard

0

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
 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 [nums[i],nums[j]]
        }
      }
    }
    
};
console.log(twoSum([15, 7, 11, 2],9))
console.log(twoSum([3, 2, 4],6))
console.log(twoSum([3,3],6))
</script>
</body>
</html>


1
这是一个只有代码的回答。为了让提问者更容易理解,你可以提供一些解释。 - ruud

0
public class Main {
    public static void main(String[] args) {

        int a[] = { 2, 4, 6 };
        for (int i = 0; i <= a.length; i++) {
            for (int j = i + 1; j < a.length; j++) {
                if (a[i] + a[j] == 10) {
                    int and[] = { i, j };
                    System.out.println(Arrays.toString(ans));
                }
            }
        }        
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接