一,前置知识
1,vector向量
二,题目
1. 两数之和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]
三,解答
1,第一次
错误,无法处理有相同元素时的情况。
代码:
class Solution {
public:
unordered_map<int,int> map;
vector<int> twoSum(vector<int>& nums, int target)
{
int index = 0;
vector<int> ans;
for(int i = 0;i < nums.size();i++)
{
map.insert(make_pair(nums[i],i));
}
int complement;
for(auto it = map.begin();it != map.end();it++)
{
complement = target - it->first;
auto another = map.find(complement);
if(another != map.end()&&another->second != it->second)
{
ans.push_back(it->second);
ans.push_back(another->second);
break;
}
}
return ans;
}
};
2,问AI,提供的解法
1)暴力遍历
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> vec;
for(int i = 0;i < nums.size();i++)
{
for(int j = i + 1;j < nums.size();j++)
{
if(nums[i] + nums[j] == target)
{
vec.push_back(i);
vec.push_back(j);
break;
}
}
}
return vec;
}
};
不用新建向量vec,直接最后return {i, j};
2)哈希表法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int,int> map;
for(int i = 0; i < nums.size();i++)
{
int complement = target - nums[i];
if(map.find(complement) != map.end())
{
return {map[complement],i};
}
map.insert({nums[i],i});
//map[nums[i]] = i;
}
return {};
}
};
经常容易忘向量和哈希表怎么访问,查询。