题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。(每个元素只用一次,当一个target值在nums数组中有多个目标值时,只返回一个就ok)
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
答案
1. 暴力解法
暴力解法很好理解,也很简单。用了一个嵌套循环,有点类似于冒泡排序,把nums数组的第一个元素和该元素后面的所有元素依次分别求和,再与target值进行比较,第一个元素完了就第二个,依次类推,直到找到与target值相等的两个元素或者循环结束。
下面代码中public static int[] method1(int[] nums, int target)
方法就是这种解法。
2. 利用HashMap
首先要知道:散列表的实现常常叫做散列(hashing)。散列是一种用于以常数平均时间插入put(K key, V value)
、删除remove(Object key)
和查找containsKey(Object key) 和get(Object key)
的技术,所以在它上面操作的时间复杂度为O(1)。
将数组nums的值作为hashmap的键值,数组nums值对应的下标作为hashmap的值,存到HashMap中,然后在循环访问一次数组,每次都在HashMap中寻找v = target - nums[i]
是否存在,如果存在,则输出i 和 get(v)
。
【注】HashMap是不允许键值出现重复,但是可以为null
,不能保证nums数组中的元素没有重复值,所以将数组nums的值作为hashmap的键值,数组nums值对应的下标作为hashmap的值,存到HashMap中的时候,如果键值出现重复,则存储的是最后一次插入的键值所对应的值。
下面代码中public static int[] method2(int[] nums, int target)
方法就是这种解法。
代码
package leetCode;
import java.util.Arrays;
import java.util.HashMap;
public class TwoSum {
public static void main(String[] args) {
int[] nums = {2, 7, 11, 15,2, 7, 11, 15,2, 11, 15};
int target = 9;
int[] result = new int[2];
//result = method1(nums, target);
result = method2(nums, target);
System.out.println(Arrays.toString(result));
}
/*
* 暴力解法
*/
public static int[] method1(int[] nums, int target) {
int[] result = new int[2];
for(int i = 0; i < nums.length - 1; i++)
for(int j = i + 1; j < nums.length; j++) {
if(nums[i] + nums[j] == target) {
result[0] = i;
result[1] = j;
return result;
}
}
return null;
}
/*
* 利用HashMap()
*/
public static int[] method2(int[]nums, int target) {
int[] result = new int[2];
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
// //使用forEach()方法遍历map
// map.forEach((Integer key, Integer value) -> {
// System.out.println("key=" + key + ", value=" + value);
// });
for(int i = 0; i < nums.length; i++) {
int v = target - nums[i];
if(map.containsKey(v) && map.get(v) != i) {
result[0] = i;
result[1] = map.get(v);
return result;
}
}
return null;
}
}