class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> mp;
for(int i=0;i<nums1.size();i++)
{
for(int j=0;j<nums2.size();j++)
{
mp[nums1[i]+nums2[j]]++;
}
}
int count=0;
for(int i=0;i<nums3.size();i++)
{
for(int j=0;j<nums4.size();j++)
{
auto it=mp.find(0-(nums3[i]+nums4[j]));
if(it!=mp.end())
{
count=count+mp[0-(nums3[i]+nums4[j])];
}
}
}
return count;
}
};
本题如果采用暴力解法遍历四个数组的时间复杂度为n的四次方,但是通过map先计算前两个数组的值的出现次数,再遍历后两个数组,通过寻找map中中是否出现相应的差值,完成统计计算。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int arr[26]={0};
for(int i=0;i<ransomNote.size();i++)
{
arr[ransomNote[i]-'a']++;
}
for(int i=0;i<magazine.size();i++)
{
arr[magazine[i]-'a']--;
}
for(int i=0;i<26;i++)
{
if(arr[i]>0)
{
return false;
}
}
return true;
}
};
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> arr;
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0) return arr;
//a的去重
if(i>0&&nums[i-1]==nums[i]) continue;
int left=i+1;
int right=nums.size()-1;
while(left<right)
{
if(nums[i]+nums[left]+nums[right]>0) right--;
else if(nums[i]+nums[left]+nums[right]<0) left++;
else{
arr.push_back({nums[i],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 arr;
}
};
采用双指针的思路,主要的关键是去重
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> arr;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i]>target&&target>=0)
{
break;
}
if(i>0&&nums[i-1]==nums[i])
{
continue;
}
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]>target&&target>=0)
{
break;
}
if(j>i+1&&nums[j-1]==nums[j])
{
continue;
}
int left=j+1;
int right=nums.size()-1;
while(left<right)
{
if((long)nums[i]+nums[j]+nums[left]+nums[right]>target)
{
right--;
}else if((long)nums[i]+nums[j]+nums[left]+nums[right]<target)
{
left++;
}else{
arr.push_back({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 arr;
}
};
注意要用不满足条件的时候要用break,不要直接return,否则会错过多种情况。