两个总和 - 不起作用

时间:2017-03-10 04:08:22

标签: java hashmap

给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。

您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。 考虑输入[3,2,4],目标是6.我将(3,0)和(2,1)添加到地图中,当我来到4并将值计算为6 - 4为2时我检查是否2是否存在于地图中的关键字,如果循环则不进入。

我应该输出[1,2],它们分别是2和4的指数

  public int[] twoSum(int[] nums, int target) {
    int len = nums.length;
    int[] arr = new int[2];
    Map<Integer,Integer> map = new HashMap<Integer,Integer>();
    for(int i = 0;i < len; i++)
    {
        int value = nums[i] - target;
        if(map.containsKey(value))
        {
            System.out.println("Hello");
            arr[0] = value;
            arr[1] = map.get(value);
            return arr;
        }
        else
        {
            map.put(nums[i],i);
        }
    }
    return null;
}

我无法解决问题所在,请帮帮我

4 个答案:

答案 0 :(得分:1)

  

给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。

     

您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。考虑输入[3,2,4],目标是6.我将(3,0)和(2,1)添加到地图中,当我来到4并将值计算为6 - 4为2时我检查是否2是否存在于地图中的关键字,如果循环则不进入。

好的,让我们退一步。

您有一个值列表[3,2,4]。您需要知道哪两个会加起来6,通过查看它我们知道答案应该是[1,2](值24

现在的问题是,你如何以编程方式做到这一点

解决方案是(说实话),非常简单,你需要两个循环,这允许你将列表中的每个元素与列表中的每个其他元素进行比较

for (int outter = 0; outter < values.length; outter++) {
    int outterValue = values[outter];
    for (int inner = 0; inner < values.length; inner++) { 
        if (inner != outter) { // Don't want to compare the same index
            int innerValue = values[inner];
            if (innerValue + outterValue == targetValue) {
                // The outter and inner indices now form the answer
            }
        }
    }
}

虽然效率不高(是的,优化内循环很容易,但考虑到OP当前的尝试,我已经做过),这是一个非常简单的例子,说明如何实现实际上非常常见的问题< / p>

答案 1 :(得分:0)

int value = nums[i] - target;

您的减法是向后的,因为nums[i]可能小于target。因此value设置为负数。以下情况会更好:

int value = target - nums[i];

(修复此问题不会修复整个程序,但它解释了为什么你会得到你的行为。)

答案 2 :(得分:0)

这个代码可以帮助你。对于整数数组的输入,如果值的总和= target,它将返回数组的索引。

public static int[] twoSum(int[] nums, int target) {
     int[] indices = new int[2];
     outerloop:
     for(int i = 0; i < nums.length; i++){
         for(int j = 0; j < nums.length; j++){
             if((nums[i]+nums[j]) == target){
                 indices[0] = i;
                 indices[1] = j;
                 break outerloop;
             }
         }
     }
     return indices;
 }

您可以使用

调用该功能
 int[] num = {1,2,3};
 int[] out = twoSum(num,4);
 System.out.println(out[0]);
 System.out.println(out[1]);

输出:

0    2

答案 3 :(得分:0)

您应该更新值的计算方式,如下所示:

int value = target - nums[i];

如果您想更好地可视化它,也可以检查this video。它包括蛮力法和线性法: