214

问答题 214 /376

算法题:2sum,3sum

参考答案

参考回答:

2sum:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,vector<int>> mark;
for(int i=0;i<nums.size();i++)
mark[nums[i]].push_back(i);
for(int i = 0;i<nums.size();i++){
if(target-nums[i] == nums[i]){
if(mark[nums[i]].size() > 1){
vector<int> tmp{i,mark[nums[i]][1]};
return tmp;
}
}else{
if(mark.find(target-nums[i]) != mark.end()){
vector<int> tmp{i,mark[target-nums[i]][0]};
return tmp;
}
}
}
}
3sum:
void two_sum(vector<int>& nums,int i,int target,vector<vector<int>> &result){
int j = nums.size()-1;
int b = i-1;
while(i<j){
if(nums[i]+nums[j] == target){
result.push_back(vector<int>{nums[b],nums[i],nums[j]});
i++;
j--;
while(i<j && nums[i] == nums[i-1]) i++;
while(i<j && nums[j+1] == nums[j]) j--;
}else{
if(nums[i]+nums[j] < target)
i++;
else
j--;
}
}
return;
}
vector<vector<int>> threeSum(vector<int>& nums) {
set<vector<int>> result;
vector<vector<int>> result2;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
if(i>0&&nums[i-1]== nums[i])
continue;
else
two_sum(nums,i+1,-nums[i],result2);
return result2;
}