454.四数相加
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数
// 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中
for (int a : nums1) {
for (int b : nums2) {
umap[a + b]++;
}
}
int count = 0; // 统计a+b+c+d = 0 出现的次数
// 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
for (int c : nums3) {
for (int d : nums4) {
if (umap.find(0 - (c + d)) != umap.end()) {
count += umap[0 - (c + d)];
}
}
}
return count;
}
};
这个题是比赎金信难一点点的,主要是不容易想起来,两两操作,看完代码就知道怎么个思路,但是自己想就是想不起来
383.赎金信
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char,int> record_map;
for(auto a:magazine)
{
record_map[a]++;
}
for(auto b:ransomNote)
{
record_map[b]--;
if(record_map[b]<0)
{
return false;
}
}
return true;
}
};
自己完成,其实这个用不需要用map可以用简单的哈希数组!!! 如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int hash[26]={0};
for(auto a:magazine)
{
hash[a-'a']++;
}
for(auto b:ransomNote)
{
hash[b-'a']--;
if(hash[b-'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) //如果第一位a就大于0,肯定不会满足条件了
{
return result;
}
//但是需要对 第一位a进行去重
// 正确去重a方法
//去重,并不代表三元组内的元素都不得重复,需要注意
if (i > 0 && nums[i] == nums[i - 1]) { //去重这块需要注意,如果去重不当,会漏掉,
continue;
}
int left=i+1;
int 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]});
// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
// 找到答案时,双指针同时收缩
right--;
left++;
}
}
}
return result;
}
};
没有掌握,感觉里边的去重部分还是有点不理解,先过掉,要赶一下进度
18.四数之和
在三数之和基础上加了一层for循环,以此类推 五数之和,六数之和都是这样
暂时先看一遍