454. 四数相加 II(简单)
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int>umap;//遍历前两个数组,统计和以及出现的次数
for(int a:nums1)
for(int b:nums2)
umap[a+b]++;
int count=0;
for(int c:nums3)
for(int d:nums4)
if(umap.find(-(c+d))!=umap.end())
count+=umap[-(c+d)];
return count;
}
};
383. 赎金信(简单)
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26]={0};
//magazine字符串长度一定大于等于randomNote
if(ransomNote.size()>magazine.size())
return false;
//记录magazine中每个字符的出现次数
for(int i=0;i<magazine.size();i++)
record[magazine[i]-'a']++;
for(int j=0;j<ransomNote.size();j++)
{
record[ransomNote[j]-'a']--;
if(record[ransomNote[j]-'a']<0)
return false;
}
return true;
}
};
15. 三数之和(双指针法)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;//用于记录返回值
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]>0) //第一个元素大于零,不可能成立
return result;
if(i>0&&nums[i]==nums[i-1])
continue;//对元素a去重
int left=i+1,right=nums.size()-1;
while(right>left)
{
if(nums[i]+nums[left]+nums[right]>0)right--;
else if(nums[i]+nums[left]+nums[right]<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;
}
};
- 需要去重
- 先排序,i固定住,left指向i下一个,right指向最后一个,三个数之和大于0,right往左走,小于0,left往右走
- 去重的位置写错