454.四数相加II
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
//看了题解之后才想出来
//a+b的四种组合都不一样, 所以(a+b)和(c+d)中value值取大的
unordered_map<int,int> umap;
for(int i:nums1)
{
for(int j:nums2)
{
umap[i+j]+=1; //这一句有疑惑,初始化一个key之后,默认value为0
}
}
int count=0;
for(int c:nums3)
{
for(int d:nums4)
{
if(umap.find(-(c+d))!=umap.end())
{
count+=umap[-(c+d)];
}
}
}
return count;
}
};
map的初始化疑惑
#include <iostream>
#include <map>
using namespace std;
int main() {
cout << "hello https://tool.lu/" << endl;
map<int,int>alpha;
alpha.insert(pair<int,int>(20,100));
cout<<alpha[20]<<endl;
alpha[30]; //相当于初始化了一个key,但是未赋值,默认为0
cout<<alpha[30]<<endl; //0
return 0;
}
383. 赎金信
1.访问字符串 string[i]表示字符串的第i个字符
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//和 242.有效的字母异位词 差不多,只不过数组里面的值的判断条件改变
int mag[26]={0};
//给mag数组里面充值
for(int i=0;i<magazine.size();i++)
{
mag[magazine[i]-'a']++;
}
//字符串的访问和数组的访问差不多。 string[i]表示字符串的第i个字符
for(int j=0;j<ransomNote.size();j++)
{
mag[ransomNote[j]-'a']--;
}
for(int k=0;k<26;k++)
{
if(mag[k]<0)
{
return false;
}
}
return true;
}
};
15. 三数之和
好多细节不确定,迷迷糊糊的。找时间再看一遍
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(nums[i]>0) //第一个元素大于0,整体不可能为0了
{
return res;
}
//为什么放这里,放在下一个while里面是错的,放在下一个while里面死循环了
if(i>0 && nums[i]==nums[i-1]) //i>0 是小心边界溢出
{
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
{
res.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++;
}
// b和c去重的例子 -1 -1 -1 -1 1 1 1 1 1 1 2
}
}
return res;
}
};
18. 四数之和
没做,写数据融合作业,改天补。