454.四数相加
使用 unordered_map 容器,key 表示 a+b 的所有结果,value 表示 a+b 的值出现的次数;两次遍历,第一次把 a+b 的值和次数存入 map;第二次遍历 c、d 找到map 中是否存放过 0 - (c+d) 如果有,则配对成功,count 记录成功的个数
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int>map;
for(int a:nums1){
for(int b:nums2){
map[a+b]++;
}
}
int count=0;
for(int c:nums3){
for(int d:nums4){
if(map.find(0-(c+d))!=map.end())
count+=map[0-(c+d)];
}
}
return count;
}
};
383.赎金信
hash法,小写字母26个就可以用哈希数组
bool canConstruct(char * ransomNote, char * magazine){
int hash[26]={0};
for(int i=0;i<strlen(ransomNote);i++){
hash[ransomNote[i]-'a']++;
}
for(int i=0;i<strlen(magazine);i++){
hash[magazine[i]-'a']--;
}
for(int i=0;i<26;i++){
if(hash[i]>0)
return false;
}
return true;
}
15.三数之和
双指针法: i 作为确定值,left 和 right 遍历
注意:去重操作:i : nums[i] == nums[i - 1] i++; left : nums[left] ==nums[left+1] left++; right : nums[right] == nums[right-1] right --;
如果无需去重,right- -,同时,left++
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;
int left=i+1;
int right=nums.size() - 1;
while(left<right){
if(nums[i]+nums[left]+nums[right]<0)
left++;
else if(nums[i]+nums[left]+nums[right]>0)
right--;
else{
result.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 result;
}
};
15.三数之和
比三数之和多一层循环,i + j 作为确定值,left 和 right 循环
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i = 0;i < nums.size();i++){
if(i>0 && nums[i]==nums[i-1])
continue;
for(int j = i+1;j < nums.size();j++){
if(j>i+1 && nums[j]==nums[j-1])
continue;
int left=j+1;
int right=nums.size()-1;
while(left<right){
if((nums[i]*1ll+nums[j]+nums[right]+nums[left])>target)
right--;
else if((nums[i]*1ll+nums[j]+nums[right]+nums[left])<target)
left++;
else
{
result.push_back(vector<int>{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 result;
}
};