开始的时候我觉得这道题有问题,说答案只会有一个,那12和21用哪个呢?我只能假定按照数组顺序来,小数在前大数在后。
题目并没有说数据不会重复,只说有一种答案,那如果数组是33208,target是6,答案也是只有一个啊,但是用题目中给的哈希方法肯定就会崩。
后来才发现,不是的,输出的数据顺序是不影响结果的,而数据如果重复也完全不影响数据的输出结果。因为哈希的作用是查表,只会有一种情况出现重复的情况,那就是两个数相等。但是如果相等存储的肯定是较大的那个下标,而遍历的时候会先遍历较小的下标,较小的那个如一旦发现有满足条件的就直接break,不会出问题。不过我认为如果是三个数之和还用这种方法可能就会有问题。
太久不写代码,人都傻了,连这么简单的代码都得调试半天,愚蠢。而且哈希的方法我竟然连想都没想,只是知道暴力肯定不行,有毛用,看来得找找状态了。
时间复杂的O(N),空间复杂的O(N)
class Solution {
public:
vector<int> twoSum(vector<int>&v, int target)
{
vector<int> a;
unordered_map<int,int>b;
int n=v.size();
for(int i=0;i<n;++i)
b.insert({v[i],i});
for(int i=0;i<n;++i)
{
auto got = b.find(target-v[i]);
if((got != b.end()) && (i != got->second))
{
a.push_back(i);
a.push_back(got->second);
break;
}
}
return a;
}
};