坑炸了,想速度快一点,想着用hash解决,这样避免用O(n2)循环嵌套
中途遇到的坑
- 数组可能有负数(这个我想到了,为了使用hash,需要进行一次遍历进行转化)
- 如果存在负数,就需要数组化为全是正数,注意加上第一个数的绝对值即可,因为升序排列,但是target是由两个数相加得到的,所以需要加双倍的第一个数的绝对值
- 一个元素不能使用两次,这个是需要加限制的,如果hash表里面显示的index和当前index相同,需要continue,但是这是建立在当前值加在hash表里之后再作判断才会发生的状况,就是当前值3做判断,因为hash表里还没录入当前值3信息,就可以避免这种情况【(2,3,4):6】
- 一个元素不能使用两次,但是可能出现两个相同数值的元素【(0,0,1,2):0】,这个坑在如果先将当前值加在hash表里之后再作判断会发生,就是检测到第二个零,先更新hash表就会将原来的0给抹掉,再做加和判断就不对了
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> ans;
if(numbers[0] < 0)
{
int a = numbers[0];
for(int i = 0; i < numbers.size(); i++)
{
numbers[i] -= a;
}
target = target - (2*a);
}
int * A = (int *)malloc((target + 1) * sizeof(int));
for(int i = 0; i <= target;i++)
{
A[i] = -5;
}
for(int i = 0; i< numbers.size(); i++)
{
if(A[target - numbers[i]] != -5)
{
// if(A[target - numbers[i]] == i + 1)
// {
// continue;
// }
ans.push_back(A[target - numbers[i]]);
ans.push_back(i+1);
return ans;
}
if(numbers[i] <= target)
{
A[numbers[i]] = i + 1;
}
}
}
};