空HashMap的containsKey()为何返回true?Two Sum解法疑问
关于Two Sum问题中HashMap解法的疑问解答
你误解了HashMap的使用逻辑——初始化的空Map确实没有任何键,但这类高效解法的核心是边遍历数组边往Map中存入已处理过的元素,而非一开始就用空Map去匹配整个数组,具体流程拆解如下:
- 初始化空HashMap,用来记录已经遍历过的数组元素及其对应的索引
- 逐个遍历数组元素:
- 计算目标值与当前元素的差值:
complement = target - nums[i] - 检查该差值是否存在于HashMap的键集合中:
- 若存在:说明之前遍历过的某个元素和当前元素相加正好等于目标值,直接返回这两个元素的索引
- 若不存在:将当前元素和它的索引存入HashMap,继续下一轮遍历
- 计算目标值与当前元素的差值:
用Java代码举个直观的例子:
public int[] twoSum(int[] nums, int target) { HashMap<Integer, Integer> numMap = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (numMap.containsKey(complement)) { return new int[] { numMap.get(complement), i }; } numMap.put(nums[i], i); } throw new IllegalArgumentException("不存在满足条件的两个数"); }
拿具体场景验证:假设数组是[2,7,11,15],目标值为9
- 第一次遍历元素
2:差值为7,此时Map为空,containsKey(7)返回false,将2和索引0存入Map - 第二次遍历元素
7:差值为2,此时Map中已有键2,直接返回[0,1]
你之前的疑惑源于没抓住“边遍历边存值”这个关键——空Map只有在存入了已处理元素后,containsKey()才有可能返回true,首次遍历的时候必然是false。很多解法说明没明确这个顺序,才造成了误解。
内容的提问来源于stack exchange,提问作者RYAN SIEGRIST
相关产品推荐
相关产品推荐

