1.四数相加
1.1 题目链接
1.2 题解
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4)
{
int count = 0;
unordered_map<int, int> result;
for (int i = 0; i < nums1.size(); i++)
{
for (int j = 0; j < nums2.size(); j++)
{
result[nums1[i]+nums2[j]]++;
}
}
for (int i = 0; i < nums3.size(); i++)
{
for (int j = 0; j < nums4.size(); j++)
{
int s = -(nums3[i] + nums4[j]);
auto t = result.find(s);
if (t!=result.end())
{
count = count + t->second;
}
}
}
return count;
}
};
两个两个数组为一对。先计算前两个数组的和,存入map,key为和,value为和出现的次数。再计算后两个数组的和,如果该和的相反数能在map里面找到,则将count+找到的key对应的value,没找到就进入下一个循环。
2.赎金信
2.1 题目
2.2 题解
哈希表解法,和有效的字母异位词思想差不多:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine)
{
int result[26]={0};
if(ransomNote.size()>magazine.size())return false;
for(auto i:magazine)
{
result[i-'a']++;
}
for(auto j:ransomNote)
{
result[j-'a']--;
}
for(auto i:result)
{
if(i<0)
{
return false;
}
}
return true;
}
};
暴力解法:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine)
{
if(ransomNote.size()>magazine.size())return false;
for(int i=0;i<magazine.length();i++)
{
for(int j=0;j<ransomNote.length();j++)
{
if(magazine[i]==ransomNote[j])
{
ransomNote.erase(ransomNote.begin() + j);
}
}
}
if(ransomNote.length()==0)
{
return true;
}
return false;
}
};
3.三数之和
3.1 题目
3.2 题解
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)break;
//去重a
if (i > 0 && nums[i] == nums[i - 1])continue;
//定义左右两个指针
int left = i + 1;
int right = nums.size() - 1;
while (right > left)
{
//大了,right指针往左移动
if (nums[i] + nums[left] + nums[right] > 0)
{
right--;
}
//小了,left指针往右移动
else if (nums[i] + nums[left] + nums[right] < 0)
{
left++;
}
//找到了我们的结果
else
{
result.push_back({ nums[i],nums[left],nums[right] });
//接下来对b和c进行去重
while (right > left && nums[right] == nums[right - 1])right--;
while (right > left && nums[left] == nums[left + 1])left++;
right--;
left++;
}
}
}
return result;
}
};
这题目有点复杂
4.四数之和
4.1 题目
4.2 题解
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 (nums[i] > target&&nums[i]>=0)break;
//对a去重
if (i > 0 && nums[i] == nums[i - 1])continue;
for (int j = i + 1; j < nums.size(); j++)
{
if (nums[j] + nums[i] > target && nums[j] + nums[i] >= 0)break;
//对b去重
if (j > i + 1 && nums[j] == nums[j - 1])continue;
int left = j + 1;
int right = nums.size() - 1;
while (right > left)
{
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
{
result.push_back({ nums[i],nums[j],nums[left],nums[right] });
//对cd去重
while (right>left&&nums[right] == nums[right - 1])right--;
while (right>left&&nums[left] == nums[left + 1])left++;
right--;
left++;
}
}
}
}
return result;
}
};