454 四数相加2
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4)
{
unordered_map<int,int>mp1;
int res=0;
for(auto n1:nums1)
{
for(auto n2:nums2)
{
mp1[n1+n2]++;
}
}
for(auto n3:nums3)
{
for(auto n4:nums4)
{
int m=0-n3-n4;
if(mp1.find(m)!=mp1.end())
{
res+=mp1[m];
}
}
}
return res;
}
};
383赎金信
为数不多的一次通过 c++新特性真的太简洁了
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size()>magazine.size()) return false;
unordered_map<char,int>mp;
for(auto a:magazine)
{
mp[a]++;
}
for(auto b:ransomNote)
{
mp[b]--;
}
for(auto m:mp)
{
if(m.second<0) return false;
}
return true;
}
};
18四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>>res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i]>target&&nums[i]>=0) break;
if(i>0&&nums[i]==nums[i-1])continue;
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]>target&&nums[i]+nums[j]>=0) break;
if(j>i+1&&nums[j]==nums[j-1])continue;
int l=j+1;
int r=nums.size()-1;
while(l<r)
{
long sum= (long)nums[i] + nums[j] + nums[l] + nums[r];
if(sum>target) r--;
else if(sum<target) l++;
else
{
res.push_back(vector<int>{nums[i],nums[j],nums[l],nums[r]});
while(l<r&&nums[r]==nums[r-1])
{
r--;
}
while(l<r&&nums[l]==nums[l+1])
{
l++;
}
r--;
l++;
}
}
}
}
return res;
}
};
15四数之和
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>res;
sort(nums.begin(),nums.end());
if(nums[0]>0) return res;
for(int i=0;i<nums.size();i++)
{
if(i>0&&nums[i]==nums[i-1]) continue;
int left=i+1;
int right=nums.size()-1;
while(left<right)
{
int sum=nums[i]+nums[left]+nums[right];
if(sum>0){
right--;
}
else if(sum<0){
left++;
}
else
{
res.push_back(vector<int>{nums[i], nums[left], nums[right]});
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
};
}
}
return res;
}
};