454.四数相加II
- 先分组,然后通过hash map记录组内情况,其中key是两数之和,value是出现次数。
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> map1;
for(int t: nums1){
for(int j : nums2){
map1[t+j]++;
}
}
int count = 0;
for(int k :nums3){
for(int p : nums4){
if(map1.find(0-k-p)!= map1.end())
count += map1[0-k-p];
}
}
return count;
}
};
383.赎金信
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> note;
for(char c: magazine) note[c]++;
for(char c: ransomNote){
note[c]--;
if(note[c]<0) return false;
}
return true;
}
};
15.三数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
for(int i=0;i<nums.size()-2;++i){
if (nums[i] > 0) {
return ans;
}
if(i>0 && nums[i]==nums[i-1] ) continue;
int left = i+1, right = nums.size()-1;
while(left<right){
if((nums[i]+nums[left]+nums[right]) > 0) right--;
else if((nums[i]+nums[left]+nums[right]) < 0) left++;
else{
ans.push_back(vector<int>{nums[i], 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;
}
};
18.四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
if(nums.size()<4) return ans;
for(int i=0;i<nums.size()-3;++i){
if(i>0 && nums[i]==nums[i-1]) continue;
for(int j=i+1;j<nums.size()-2;++j){
if(j>i+1 && nums[j]==nums[j-1]) continue;
int left = j+1, right = nums.size()-1;
while(left<right){
long long sum = (long long)nums[i] + nums[j] + nums[left] + nums[right];
if(sum>target) right--;
else if(sum<target) left++;
else{
ans.push_back(vector{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;
}
};