变形1:变化是该数组有重复数字,需要输出所有符合要求的数字对
解题思路:
- 扫描时还是先检查当前元素值是否存在于map中,然后将键值对(target - nums[i], i)插入到map中,不过由于有重复元素,所以需要将重复的元素的index也加入,因此map的映射类型为<Integer, ArrayList>
public ArrayList<ArrayList<Integer>> func1(int[] nums, int target) {
Map<Integer, ArrayList<Integer>> mp = new HashMap<>();
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (mp.containsKey(nums[i])) {
for (int j = 0; j < mp.get(nums[i]).size(); j++) {
ArrayList<Integer> temp = new ArrayList<>();
temp.add(mp.get(nums[i]).get(j));
temp.add(i);
res.add(temp);
}
}
if (mp.containsKey(target - nums[i])) {
mp.get(target - nums[i]).add(i);
} else {
ArrayList<Integer> t =
new ArrayList<>();
t.add(i);
mp.put(target - nums[i], t);
}
}
return res;
}