【学透哈希表,map使用有技巧!LeetCode:454.四数相加II】https://www.bilibili.com/video/BV1Md4y1Q7Yh?vd_source=a237c29de1db3f7db9579205f55c55a1
第一眼思路:无思路,可能就是想着暴力解法,看完卡哥思路,简直是太妙了
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> mp;
int count=0;
for(int a:nums1 )
for(int b:nums2)
mp[a+b]++;
for(int c:nums3)
for(int d:nums4)
{
int target=0-(c+d);
count+=mp[target];
}
return count;
}
};
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size()>magazine.size())
return false;
int result[26];
for(int i=0;i<magazine.size();i++)
result[magazine[i]-'a']++;
for(int j=0;j<ransomNote.size();j++)
{
result[ransomNote[j]-'a']--;
if(result[ransomNote[j]-'a']<0)
return false;
}
return true;
}
};
梦破碎的地方!| LeetCode:15.三数之和_哔哩哔哩_bilibili
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;
if(i>0&&nums[i]==nums[i-1])
continue;
int left=i+1;
int right=nums.size()-1;
int sum;
while(left<right)
{
sum=nums[i]+nums[left]+nums[right];
if(sum>0)
right--;
else if(sum<0)
left++;
else
{
result.push_back(vector<int>{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++;
}
}
}
return result;
}
};
难在去重和剪枝!| LeetCode:18. 四数之和_哔哩哔哩_bilibili
在上一题的基础上加一层循环,对于剪枝不能简单的判断,要注意到两个负数相加会比原来小;
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int k=0;k<nums.size();k++)
{
if(nums[k]>=0&&nums[k]>target)//注意这里的判定
break;
if(k>0&&nums[k]==nums[k-1])
continue;
for(int i=k+1;i<nums.size();i++)
{
if(nums[i]+nums[k]>=0&&nums[i]+nums[k]>target)
break;
if(i>k+1&&nums[i]==nums[i-1])
continue;
int left=i+1;
int right=nums.size()-1;
while(left<right)
{
if((long)nums[k]+nums[i]+nums[left]+nums[right]>target)
right--;
else if((long)nums[k]+nums[i]+nums[left]+nums[right]<target)
left++;
else
{
result.push_back(vector<int>{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++;
}
}
}
}
return result;
}
};