题目
给定一个整数数组
nums
和一个目标值target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
考点
On,要用hash查找,不然暴力会超时,用unordered_map无序(hash,不是map(有序,红黑树).
思路
代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
if(nums.empty())
return nums;
vector<int> ret;
unordered_map<int,int> map;//这里要用无序查找
int i = 0;
while(!nums.empty())
{
int key=*nums.begin();
map[key]=target-key;
nums.erase(nums.begin());//这里删了一个元素,loop里面会迭代两次,所以不能用for(auto :)
int j = i+1;
for(auto val : nums)
{
if(val==map[key])
{
ret.push_back(i);
ret.push_back(j);
return ret;
}
j++;
}
i++;
}
return ret;
}
};
法2 , 将数组值作为key,索引作为val,用无序映射的find(key)方法来查找,find返回it。it的第一个值是key,第二个值是val
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> hash;
for (int i = 0; i < nums.size(); i++) {
auto iter = hash.find(target - nums[i]);//用hash.find进行key-value映射查找
if (iter != hash.end()) {
return vector{iter->second, i};//it.first==key,it.second==val
};
hash[nums[i]] = i;//单值映射
}
return vector<int>();
}
};
法3.map自带方法count。证明 有这个key存在。直接返回map[key]就是索引了。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
for(int i =0; i <nums.size();i++)
{
if(map.count(target-nums[i]))
return {i,map[target-nums[i]]};
map[nums[i]]=i;
}
return {};
}
};
问题
ref: