传送门:https://leetcode.cn/problems/two-sum/
目录
题目描述
题解
题目描述
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0,1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
题解
哈希遍历
以输入nums=[2,7,11,15],target=9为例,本题要求返回数组中和为目标值的元素下标。故在创建的哈希表中以数组元素(nums[i])为key,以其下标(i)作为value
遍历输入用例nums=[2,7,11,15],并在哈希表中寻找是否含有key=target-nums[i]。若有则返回现在的数组下标i和key=target-nums[i]对应的value
上述方法先建表再遍历,需要两次循环且需考虑重复元素;如输入nums=[3,3],target=6,故不仅需要判断哈希表中是否含有key=target-nums[i],还需通过比较重复元素的下标来确保查到的元素不能为本身(hash[target-nums[i]]!=i)
下文中代码属于边建表边遍历,仅需一次循环且无需考虑重复元素。该方法的特点是每次向哈希表中添加一个元素时,均会判断哈希表中是否含有key=target-nums[i]且作用表中不含有key=target-nums[i]时,该元素才会被放入。这意味着当放入两个重复的元素时,前者因不满足条件而被放入哈希表,而后者因满足条件未被放入表中,即得出结果时表中没有两个重复的元素;故无需比较重复元素的下标来确认是重复元素中的哪一个
C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> hash;
for(int i=0;i<nums.size();i++){
if(hash.count(target-nums[i])){
return {hash[target-nums[i]],i};
}
hash[nums[i]]=i;
}
return {};
}
};
C#
public class Solution {
public int[] TwoSum(int[] nums, int target) {
Dictionary<int,int> hash=new Dictionary<int,int>();
for(int i=0;i<nums.Length;i++){
if(hash.ContainsKey(target-nums[i])){
return new int[]{hash[target-nums[i]],i};
}
hash[nums[i]]=i;
}
return new int[]{};
}
}