1. 哈希表
1.1 思路
在无序数组中,根据索引查找目标值的时间复杂度 O(1),根据目标值查找索引的时间复杂度 O(n)。使用哈希表建立目标值与索引的映射关系,以空间换时间,将查找时间从 O(n) 降低到 O(1)。
可以采用两次遍历的方式,第一次建立哈希表,第二次查找整数对。注意,题目要求元素不能重复使用。由于输入数组中可能含有重复元素,不能单纯根据目标值是否相同判断重复元素,而是要根据索引是否相同来判断。
实际上,一次遍历即可完成任务。在将某元素加入哈希表前,查找现有哈希表中是否存在对应的目标元素。这样,对结果中元素顺序施加人为约束,还可以避免重复结果的出现(本题答案唯一,不会考虑这种情况)。
1.2 复杂度
时间复杂度:O(n)
空间复杂度:O(n)
1.3 代码
class Solution {
public int[] twoSum(int[] nums, int target) {
if (nums == null || nums.length < 2) {
return new int[2];
}
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int tmp = target - nums[i];
if (map.containsKey(tmp)) {
return new int[]{i, map.get(tmp)};
}
map.put(nums[i], i);
}
return new int[2];
}
}