题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一:直接暴力求解
这个不用说,第一想法就是直接双重循环。
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
for(int i=0; i<len-1; i++){
int a = target-nums[i];
for(int j=i+1; j<len; j++ ){
if(nums[j]==a){
return new int[]{i, j};
}
}
}
throw new RuntimeException();
}
方法二:考虑降低时间复杂度,将双重循环调整为一重循环。
public int[] twoSum(int[] nums, int target) {
Map<Integer , Integer> m = new HashMap<>();
for(int i=0; i<nums.length; i++){ //遍历每个数
int a = target - nums[i]; //计算差
//检查差值是否已经在hashMap中,根据题目,只会出现一对结果,如果有则找到结果
//每个hash值对应一个短链表或一颗红黑树,其查找速度很快,所以containsKey()时间复杂度近似 O(1)。
if(m.containsKey(a)){
return new int[]{m.get(a), i};
}
m.put(nums[i], i);
}
throw new RuntimeException();
}