题目:
给定一个整数,返回数组中两个数相加等于目标值的索引,默认答案具有唯⼀解,且同⼀个成员不可以使⽤两次
解题方法
- 暴力解法:两层for循环
- 使用哈希表
在这里不推荐使用第一种解法,因为第一种解法的时间复杂度为O(n^2),所以今天主要讲解的是第二种解法,即哈希表。
思路:同一个成员不可以使用两次,表明没有重复元素,只需要在遍历数组中某一个元素时,判断与之相加等于目标值的元素是否已经被遍历过,那这种类似于判断某个元素是否出现过,或者判断某个集合中是否有某个元素,此时我们可以用hashTable来解决,时间复杂度为O(n)。
代码实现:
public static List<Integer> sumOfTwoNumbers(int[] nums, int target) {
if (nums == null || nums.length < 2)
return null;
// 初始化一个集合用来作为结果返回
List<Integer> result = new ArrayList<>(2);
int num;
// map的key存储集合中元素的值,value存储元素的索引
Map<Integer, Integer> map = new HashMap<>(nums.length);
for (int i = 0; i < nums.length; i++) {
num = target - nums[i];
if (map.containsKey(num)) {
result.add(map.get(num));
result.add(i);
return result;
}
// 没遍历过则将当前元素也加入到map中
map.put(nums[i], i);
}
return null;
}
提示:这里说明一下为什么要用Map中的key来存储数组中元素的值,因为在这道题目中,我们主要做的是判断某个元素是否被遍历过,那由于hashmap在查找某一元素的时候,是根据key的hashCode来确定元素所在的位置,所以把元素值作为key,能更快的确定当前元素是否在map中,即当前元素是否已经遍历过。