數對和
雙指針:
class Solution {
public:
vector<vector<int>> pairSums(vector<int>& nums, int target)
{
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
int l=0,r=nums.size()-1;
while(l<r){
int sum = nums[l]+nums[r];
if(sum>target){
r--;
}else if(sum<target){
l++;
}else{
ans.push_back(vector<int>{nums[l],nums[r]});
l++;
r--;
}
}
return ans;
}
};
哈希表的一般做法:
class Solution {
public:
unordered_map<int,int> numbers;
vector<vector<int>> ans;
vector<vector<int>> pairSums(vector<int>& nums, int target) {
for(int x:nums){
if(!numbers.count(x)){
numbers[x]=0;
}
numbers[x]++;
}
for(int x:nums){
if(numbers[x]){
numbers[x]--;
if(numbers[target-x]){
numbers[target-x]--;
ans.push_back(vector<int>{x,target-x});
}else{
numbers[x]++;
}
}
}
return ans;
}
};
或者只遍歷一次。
class Solution {
public:
unordered_map<int,int> map;
vector<vector<int>> ans;
vector<vector<int>> pairSums(vector<int>& nums, int target) {
for(int x:nums){
if(map[target-x]){
map[target-x]--;
ans.push_back(vector<int>{x,target-x});
}else{
map[x]++;
}
}
return ans;
}
};