坑炸了初狰,想速度快一點(diǎn)榔至,想著用hash解決,這樣避免用O(n2)循環(huán)嵌套
中途遇到的坑
- 數(shù)組可能有負(fù)數(shù)(這個(gè)我想到了闹瞧,為了使用hash绑雄,需要進(jìn)行一次遍歷進(jìn)行轉(zhuǎn)化)
- 如果存在負(fù)數(shù),就需要數(shù)組化為全是正數(shù)奥邮,注意加上第一個(gè)數(shù)的絕對(duì)值即可万牺,因?yàn)樯蚺帕校莟arget是由兩個(gè)數(shù)相加得到的洽腺,所以需要加雙倍的第一個(gè)數(shù)的絕對(duì)值
- 一個(gè)元素不能使用兩次脚粟,這個(gè)是需要加限制的,如果hash表里面顯示的index和當(dāng)前index相同蘸朋,需要continue核无,但是這是建立在當(dāng)前值加在hash表里之后再作判斷才會(huì)發(fā)生的狀況,就是當(dāng)前值3做判斷藕坯,因?yàn)閔ash表里還沒(méi)錄入當(dāng)前值3信息团南,就可以避免這種情況【(2,3炼彪,4):6】
- 一個(gè)元素不能使用兩次吐根,但是可能出現(xiàn)兩個(gè)相同數(shù)值的元素【(0,0辐马,1拷橘,2):0】,這個(gè)坑在如果先將當(dāng)前值加在hash表里之后再作判斷會(huì)發(fā)生喜爷,就是檢測(cè)到第二個(gè)零冗疮,先更新hash表就會(huì)將原來(lái)的0給抹掉,再做加和判斷就不對(duì)了
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;
}
}
}
};