454. 四数相加 II - 力扣(LeetCode)
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> umap;
for(int a : A){
for(int b : B){
umap[a+b]++;
}
}
int count =0;
for(int c : C){
for(int d : D){
if(umap.find(0-(c+d)) != umap.end()){
count += umap[0-(c+d)];
}
}
}
return count;
}
};
383. 赎金信 - 力扣(LeetCode)
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> umap;
for(int i = 0; i <magazine.size(); i++){
umap[magazine[i]]++;
}
for(int j =0; j<ransomNote.size();j++){
if(umap.find(ransomNote[j]) != umap.end()){
umap[ransomNote[j]]--;
if(umap[ransomNote[j]]<0){
return false;
}
}
else{
return false;
}
}
return true;
}
};
15. 三数之和 - 力扣(LeetCode)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
for( int i = 0; i<nums.size() ; i++){
if(nums[i]>0){
return result;
}
else{
if(i>0&&nums[i] == nums[i-1]){
continue;
}
else{
int left = i +1;
int right = nums.size() -1 ;
while (left < right) {
int sum = nums[left] + nums[right] + nums[i];
if (sum == 0) {
result.push_back({nums[i], nums[left], nums[right]});
while (left < right && nums[right] == nums[right - 1]) --right; // 去重
while (left < right && nums[left] == nums[left + 1]) ++left; // 去重
--right;
++left;
} else if (sum > 0) {
--right;
} else {
++left;
}
}
}
}
}
return result;
}
};
18. 四数之和 - 力扣(LeetCode)
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
for(int k = 0 ; k <nums.size(); k++){
if(nums[k]>target && nums[k]>=0){
break;
}
else if(k>0&&nums[k]==nums[k-1]){
continue;
}
else{
for( int i = k+1; i<nums.size() ; i++){
if(nums[i]+nums[k]>=0 && nums[k]+nums[i]>target){
break;
}
else{
if(i>k+1&&nums[i] == nums[i-1]){
continue;
}
else{
int left = i +1;
int right = nums.size() -1 ;
while (left < right) {
long long sum = (long long)nums[k]+nums[left] + nums[right] + nums[i];
if (sum == target) {
result.push_back({nums[k],nums[i], nums[left], nums[right]});
while (left < right && nums[right] == nums[right - 1]) --right; // 去重
while (left < right && nums[left] == nums[left + 1]) ++left; // 去重
--right;
++left;
} else if (sum > target) {
--right;
} else {
++left;
}
}
}
}
}
}
}
return result;
}
};