目录
[454. 四数相加 II](#454. 四数相加 II)
[383. 赎金信](#383. 赎金信)
[15. 三数之和](#15. 三数之和)
[18. 四数之和](#18. 四数之和)
454. 四数相加 II
cpp
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int ans=0;
unordered_map<int,int> map;
int n=nums1.size();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
map[nums1[i]+nums2[j]]++;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int t=-(nums3[i]+nums4[j]);
ans+=map[t];
}
}
return ans;
}
};
383. 赎金信
cpp
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char,int> map;
for(char t:magazine){
map[t]++;
}
for(char t:ransomNote){
if(map[t]){
map[t]--;
}
else {
return false;
}
}
return true;
}
};
15. 三数之和
cpp
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; i++) {
if(nums[i]>0)continue;
if(i>0&&nums[i]==nums[i-1])continue;
int t = -nums[i];
int j = i + 1;
int k = nums.size() - 1;
while ( j < k) {
int sum = nums[j] + nums[k];
if (sum < t) {
j++;
} else if (sum > t) {
k--;
} else {
ans.push_back({nums[i], nums[j], nums[k]});
while(j<k&&nums[j]==nums[j+1]){
j++;
}
while(j<k&&nums[k]==nums[k-1]){
k--;
}
j++;
k--;
}
}
}
return ans;
}
};
18. 四数之和
cpp
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<vector<int>> ans;
int n=nums.size();
for(int i=0;i<n;i++){
if(i>0&&nums[i]==nums[i-1])continue;
for(int j=i+1;j<n;j++){
if(j>i+1&&nums[j]==nums[j-1])continue;
long long t=(long long)target-(long long)nums[i]-(long long)nums[j];
int left=j+1;
int right=n-1;
while(left<right){
long long sum=nums[left]+nums[right];
if(sum<t){
left++;
}
else if(sum>t){
right--;
}
else {
ans.push_back({nums[i],nums[j],nums[left],nums[right]});
while(left<right&&nums[left]==nums[left+1])left++;
while(left<right&&nums[right]==nums[right-1])right--;
left++;
right--;
}
}
}
}
return ans;
}
};
