题目链接
解题思路
遍历数组时,用哈希表保存已经出现过的数字及其下标。对于当前数字 nums[i],计算目标补数 target - nums[i]:
- 如果补数已经在哈希表中,直接返回补数的下标和当前下标。
- 如果补数尚未出现,将当前数字和下标放入哈希表,继续遍历。
先查找、后写入,可以避免同一个元素被使用两次。
复杂度
- 时间复杂度:
O(n) - 空间复杂度:
O(n)
Java 解答
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap();
for (int i = 0; i < nums.length; i++) {
int n = target - nums[i];
if (map.containsKey(n)) {
return new int[]{map.get(n), i};
}
map.put(nums[i], i);
}
return new int[]{};
}
}
复盘
这道题的关键是把“寻找另外一个数”转换成 O(1) 平均复杂度的哈希查询。哈希表中只保存当前位置之前的元素,因此命中时得到的两个下标天然不同。