454.四数相加II
四个数在不同的数组里,不用考虑重复的问题
先计算2个数的和,并且统计和出现的次数,在用目标值减去后面两个数的和,用find查找是否存在减去后的数字。
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> mymap;
int count = 0;
for(int i=0; i<nums1.size(); i++){
for(int j=0; j<nums2.size(); j++){
mymap[nums1[i] + nums2[j]]++;
}
}
for(int i=0; i<nums3.size(); i++){
for(int j=0; j<nums4.size(); j++){
if(mymap.find(0-(nums3[i] + nums4[j])) != mymap.end()){
count += mymap[0-(nums3[i] + nums4[j])];
}
}
}
return count;
}
};
383. 赎金信
和上面一题思路差不多
1.用map
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> mymap;
for(int i=0; i<magazine.size(); i++){
mymap[magazine[i]]++;
}
for(int i=0; i<ransomNote.size(); i++){
mymap[ransomNote[i]]--;
if(mymap[ransomNote[i]] < 0) return false;
}
return true;
}
};
2.数组
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int ary[26] = {0};
int size_s = ransomNote.size();
int size_t = magazine.size();
for(int i=0;i<size_s;i++){
ary[ransomNote[i]-'a']++;
}
for(int i=0;i<size_t;i++){
ary[magazine[i]-'a']--;
}
for(int i=0;i<26;i++){
if(ary[i]>0){
return false;
}
}
return true;
}
};
15. 三数之和
没想到去重方法,原来还可以用双指针。
需要注意去重是和上一个比较。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
if(nums.size()<=2) {return ans;}
sort(nums.begin(),nums.end());
// 双指针
// 去重!!
for(int i=0;i<nums.size();i++){
//排序后第一个数大于零 后面都大于零
//nums[i]固定
if(nums[i]>0){break;}
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){
ans.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++;
}
else if(nums[i]+nums[left]+nums[right]>0){
// 太大 right左移变小
right--;
while (left < right && nums[right] == nums[right + 1]) right--;
}
else{
// 太小 left右移变大
left++;
// 和刚才一样直接略过
while (left < right && nums[left] == nums[left - 1]) left++;
}
}
}
return ans;
}
};
18. 四数之和
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ans;
if(nums.size()<4) return ans;
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 right = nums.size()-1;
int left = j+1;
while(left<right){
//大于目标值 right--
//nums[i]+nums[j]>target-(nums[left]+nums[right]) 防止溢出
if(nums[i]+nums[j]>target-(nums[left]+nums[right])){
right--;
while(left<right&&nums[right]==nums[right+1]){right--;}
}
else if(nums[i]+nums[j]<target-(nums[left]+nums[right])){
left++;
while(left<right&&nums[left]==nums[left-1]){left++;}
}
else{
ans.push_back(vector<int> {nums[i],nums[j],nums[left],nums[right]});
while(left<right&&nums[right]==nums[right-1]){right--;};
while(left<right&&nums[left]==nums[left+1]){left++;};
//更新right left!!
right--;
left++;
}
}
}
}
return ans;
}
};