显然,最简单和直接的想法是使用暴力枚举:使用双重循环枚举符合条件的下标对并返回。这种方法的时间复杂度是平方级别\(O(N^2)\)。
对于每个确定的数x
,我们需要找到target - x
对应的下标,暴力枚举方法使用的是直接遍历,这个操作的复杂度是线性的,而如果我们使用哈希表将元素及其下标进行对应,再进行查找时时间复杂度就变成了常熟级别。而且,元素自己不能和自己匹配,使用哈希表先查找是否包含此键值,也可以保证不会发生这种情形。
于是,思路就是,我们从前往后遍历数组下标i
,每处理一个x = nums[i]
,首先查询target - x
是否存在哈希表中,如果存在则说明我们找到了答案,可以返回结果,如果不存在,我们就需要将此键值对{nums[i], i}
插入哈希表中,继续处理下一个元素。
// C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> m;
vector<int> res(2);
for (size_t i = 0; i < nums.size(); ++i) {
if (m.find(target - nums[i]) != m.end()) {
res[0] = m.at(target - nums[i]);
res[1] = i;
}
m.insert({nums[i], i});
}
return res;
}
};
// Java
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; ++i) {
if (map.containsKey(target - nums[i])) {
return new int[] {i, map.get(target - nums[i])};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("");
}
}
标签:map,target,nums,int,res,Hot,哈希,100,两数
From: https://www.cnblogs.com/louistang0524/p/18412283