题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
暴力解法就不解说了,主要说一下通过HashMap加速查找的方法。
核心思想:
解决这个问题就是要找到数组内与当前数字互补(当前数字下标已知),能构成target值的数字的下标。
为了快速查找,可以将数组nums映射为以数组内数值为键,以数组内数值下标为值的HashMap。(重点思想)
然后依次遍历数值数组nums,能在数组之内找到互补值的话就返回当前数值下标,然后通过互补值在HashMap中找到互补值的下标。
代码实现如下:
public int[] twoSum(int[] nums, int target) {
//数值为键,下标为值
HashMap<Integer, Integer> hashMap = new HashMap<>();
for(int i = 0; i < nums.length; i++) {
//complement是目标值与数组内数值的互补值
int complement = target - nums[i];
if (hashMap.containsKey(complement)) {
//i表示当前数字的下标,hashMap.get(complement)表示互补部分的下标
return new int[]{hashMap.get(complement), i};
}
//将nums数组映射为以数组内数值为键,以数组内数值下标为值的HashMap
hashMap.put(nums[i], i);
}
throw new IllegalArgumentException("无");
}