解决思路
查找表 Map
建立一个查找表map来保存元素,key是元素,value是对应的索引
第一步将所有元素放入查找表map
但是如果两个元素值相同,第二次的索引会覆盖第一次的索引,从而查找数据不对
例如 [4 4] 8这种情况,就无法找到正确的答案
或者[3 2 4] 6这种情况也不对
改进
不能把所有的元素都放在map中
- 遍历到v的时候
- 只查找v前面的元素是否有target-v
- 只将v前面的所有元素放入查找表
- 如果之前的查找表有,则找到了解
- 如果查找失败,将v也纳入查找表中,继续查看下一个元素
- 这样即使覆盖了相同的元素,也不会影响
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
//计算当前的补数
int complement = target - nums[i];
//如果之前的map中有补数 直接返回
if(map.containsKey(complement)){
//注意先写补数的位置
return new int[]{map.get(complement),i};
}
map.put(nums[i], i);
}
return null;
}
//time O(n)
//space O(n)