问题:找两个数字之和等于
输入:vector<int> nums,target
输出:vector<int> ls //两个数字的下标
思路:
- 暴力O(n^2)
- hash table
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
vector<int> ls;
for(int i=0;i<nums.size();i++)
{
map[nums[i]]=i;
}
for(int j=0;j<nums.size();j++)
{
int element = target - nums[j];
auto it = map.find(element);
if(it!=map.end())
{
if(j!=it->second)
{
ls.push_back(j);
ls.push_back(it->second);
return ls;
}
}
}
return ls;
}
};
一开始[3,2,4] 6出现错误,返回[0,0];
问了师兄,说是我多考虑了下标相同的情况,加了判断果然对了;
下面的solution比较巧妙,只考虑自己index前面的元素。避免了下标相同的情况。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
int n = (int)nums.size();
for (int i = 0; i < n; i++) {
auto p = map.find(target-nums[i]);
if (p!=map.end()) {
return {p->second, i};
}
map[nums[i]]=i;
}
}
};