454.用map记录nums1[i] + nums2[i] 之和每种情况出现的次数,然后用find找(0-nums3[i]-nums4[i])
383.和有效字母异位词的区别是,后者需要两个size相等
15.三数之和,挺难得其实
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int size=nums.size();
for(int i=0;i<size-2;++i){
if(nums[i]>0) return res;
if(i>0&&nums[i]==nums[i-1]) continue;
int left=i+1;
int right=size-1;
while(left<right){
if((long)nums[i]+nums[left]+nums[right]==0){
res.push_back({nums[i],nums[left],nums[right]});
left++;right--;
while(nums[left]==nums[left-1] && left<right) left++;
while(nums[right]==nums[right+1]&&left<right) right--;
}else if((long)nums[i]+nums[left]+nums[right]>0) {
right--;
}else{
left++;
}
}
}
return res;
}
};
18.四数之和,会上面那个这个好理解点,但也是巨难
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int size=nums.size();
for(int i=0;i<size-3;++i){
if(target>0 && nums[i]>target) return res;
if(i>0 && nums[i]==nums[i-1]) continue;
for(int k=i+1;k<size-2;){
int left=k+1;
int right=size-1;
while(left<right){
if((long)nums[i]+nums[k]+nums[left]+nums[right]==target){
res.push_back({nums[i],nums[k],nums[left],nums[right]});
left++;
right--;
while(nums[left]==nums[left-1] && left<right) left++;
while(nums[right]==nums[right+1] && left<right) right--;
}else if((long)nums[i]+nums[k]+nums[left]+nums[right]>target){
right--;
}else{
left++;
}
}
k++;
while(nums[k]==nums[k-1] && k<size-2) k++;
}
}
return res;
}
};