给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。
您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。 考虑输入[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;
}
我无法解决问题所在,请帮帮我
答案 0 :(得分:1)
给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。
您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。考虑输入[3,2,4],目标是6.我将(3,0)和(2,1)添加到地图中,当我来到4并将值计算为6 - 4为2时我检查是否2是否存在于地图中的关键字,如果循环则不进入。
好的,让我们退一步。
您有一个值列表[3,2,4]
。您需要知道哪两个会加起来6
,通过查看它我们知道答案应该是[1,2]
(值2
和4
)
现在的问题是,你如何以编程方式做到这一点
解决方案是(说实话),非常简单,你需要两个循环,这允许你将列表中的每个元素与列表中的每个其他元素进行比较
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)