算法入门:两数之和(Two Sum)----HashMap空间换时间经典题解

5 阅读2分钟

一、题目回顾

给定一个整数数组  nums  和一个目标值  target ,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。

  • 限制:每个输入只对应一个答案;数组中同一个元素不能使用两遍。

二、💡 核心解题思路

这道题最经典的解法就是HashMap(哈希表),核心口诀是:“存差值,查补数”。

1. 为什么要用 HashMap? ​

  • 暴力遍历(双层循环)的时间复杂度是 O(n²),太慢了。 ​
  • 使用 HashMap 可以将“查找另一个数”的速度从 O(n) 优化到 O(1),整体时间降为 O(n)。 ​ 2. 具体操作逻辑 ​
  • Key(键):存储数组中的元素值。 ​
  • Value(值):存储该元素对应的下标。 ​
  • 逻辑步骤: ​ 1. 遍历数组时,计算当前元素需要“补谁”才能等于 target(即  complement = target - nums[i] )。 ​ 2. 查:看 HashMap 里有没有存过这个“补数”。 ​ 3. 存:如果没有,就把当前元素和下标存进去( map.put(nums[i], i) ),继续遍历。 ​ 4. 返:如果找到了,直接返回  [map.get(complement), i] 。

三、⚡ 代码实现

    public int[] twoSum(int[] nums, int target) {
      Map<Integer,Integer>hashtable = new HashMap<Integer,Integer>();
      for (int i = 0;i < nums.length;++i){
        if(hashtable.containsKey(target - nums[i])){
            return new int[]{hashtable.get(target - nums[i]),i};
        }
        hashtable.put(nums[i],i);
      }
      return new int[0];
    }
}

 

四、🧠 知识点速记

1.  containsKey(key) :神器!用来快速判断“补数”有没有出现过。 ​ 2. 空间换时间:HashMap 占用了内存(存储数据),但是换来了速度的巨大提升。 ​ 3. 遍历顺序:先判断,后存入。避免把自己(当前元素)和自己配对。

五、总结

这道题是 HashMap 应用的入门第一课。记住 key 存数值,value 存下标,以后遇到“找两数之和/两数之差”这类快速查找题,第一反应就用它!