题目:
给定一个整形数组和一个整数target,返回2个元素的下标,它们满足相加的和为target。
你可以假定每个输入,都会恰好有一个满足条件的返回结果。
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
两种方法:
第一种,常规思路,遍历,for循环的嵌套,时间复杂度O(n^2)
代码:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static void main (String arg[])
{
int[] nums = new int[]{2,5,7,9};
int target = 9;
int[] result = new int[2];
result=twoSum(nums,target);
for(int i = 0 ; i<2;i++)
{
System.out.println(result[i]);
}
}
public static int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
Integer index=map.get(target-nums[i]);
if(index==null){
map.put(nums[i],i);
}else{
return new int[]{i,index};
}
}
return new int[]{0,0};
}
}
方法二:取消一次for循环,采用map代替,同时在寻找指定元素的时候,也是只需要get就可以得到结果,不再遍历。
时间复杂度O(n)。
代码如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static void main (String arg[])
{
int[] nums = new int[]{2,5,7,9};
int target = 9;
int[] result = new int[2];
result=twoSum(nums,target);
for(int i = 0 ; i<2;i++)
{
System.out.println(result[i]);
}
}
/*
* 从0开始访问,当访问完2后,计算需要9-2就是7,找曾经访问的数据中是否有7.没有的话,index就是null,那么就把(0,2)放在map中,
* 当访问第二个数字5的时候,需要9-5=2,查看是否访问过2这个元素,index=0(既有这个元素),就是结果。
* 核心:访问过的元素存在map(数值,位置),他是锁定一个i后,往前找,是否有target-i这个数字。
*/
public static int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
Integer index=map.get(target-nums[i]);
if(index==null){
map.put(nums[i],i);
}else{
return new int[]{index,i};
}
}
return new int[]{0,0};
}
}
参考:https://blog.csdn.net/lnho2015/article/details/50889558
(我修改的他的程序,在 return new int[]{index,i};这行,他原来的位置是(i,index),结果正好反了)
参考:https://blog.csdn.net/qq_28426021/article/details/80081095
(Python语言)