image.png
image.png

解决思路

查找表 Map

image.png
建立一个查找表map来保存元素,key是元素,value是对应的索引
第一步将所有元素放入查找表map
但是如果两个元素值相同,第二次的索引会覆盖第一次的索引,从而查找数据不对
例如 [4 4] 8这种情况,就无法找到正确的答案
或者[3 2 4] 6这种情况也不对

改进

不能把所有的元素都放在map中

  1. 遍历到v的时候

image.png

  1. 只查找v前面的元素是否有target-v
  2. 只将v前面的所有元素放入查找表

image.png

  1. 如果之前的查找表有,则找到了解
  2. 如果查找失败,将v也纳入查找表中,继续查看下一个元素
  3. 这样即使覆盖了相同的元素,也不会影响
  1. public int[] twoSum(int[] nums, int target) {
  2. Map<Integer,Integer> map = new HashMap<>();
  3. for(int i=0;i<nums.length;i++){
  4. //计算当前的补数
  5. int complement = target - nums[i];
  6. //如果之前的map中有补数 直接返回
  7. if(map.containsKey(complement)){
  8. //注意先写补数的位置
  9. return new int[]{map.get(complement),i};
  10. }
  11. map.put(nums[i], i);
  12. }
  13. return null;
  14. }
  15. //time O(n)
  16. //space O(n)