454.四数相加2️⃣
● 今日学习的文章链接和视频链接
● 自己看到题目的第一想法
保存两种数值,要用map
● 看完代码随想录之后的想法
分成两组加,a+b形成一个map,然后通过0-(c+d)找对应值和出现次数。
● 自己实现过程中遇到哪些困难
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> map;
for(int a:nums1){
for(int b:nums2){
map[a+b]++;
}
}
int count = 0;
for(int c:nums3){
for(int d:nums4){
if(map.find(0-(c+d))!=map.end()){
count+=map[0-(c+d)];
}
}
}
return count;
}
};
● 今日收获,记录一下自己的学习时长
0.5h
383.赎金信
● 今日学习的文章链接和视频链接
● 自己看到题目的第一想法
用map
● 看完代码随想录之后的想法
只有小写字母,采用数组映射的哈希。
● 自己实现过程中遇到哪些困难
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26]={0};
if(ransomNote.size()>magazine.size()){
return false;
}
for(int i=0;i<magazine.size();i++){
record[magazine[i]-'a']++;
}
for(int j=0;j<ransomNote.size();j++){
record[ransomNote[j]-'a']--;
if(record[ransomNote[j]-'a']<0){
return false;
}
}
return true;
}
};
● 今日收获,记录一下自己的学习时长
0.5h
15.三数之和
● 今日学习的文章链接和视频链接
● 自己看到题目的第一想法
和上面的四数相加有点像。
● 看完代码随想录之后的想法
双指针。重难点是去重(难,细节非常多)。。。。。
● 自己实现过程中遇到哪些困难
第二个for循环对b去重的时候,if条件比前面严格,需要连续三个元素相同才跳过,是为了处理如[0,0,0,0]这样的特殊情况。
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;
}
if(i>0 && nums[i]==nums[i-1]){
continue;
}
unordered_set<int> set;
for(int j=i+1;j<nums.size();j++){
if(j>i+2 && nums[j]==nums[j-1] && nums[j-1]==nums[j-2]){
continue;
}
int c = 0 - (nums[i]+nums[j]);
if(set.find(c) != set.end()){
result.push_back({nums[i],nums[j],c});
set.erase(c);
}else{
set.insert(nums[j]);
}
}
}
return result;
}
};
● 今日收获,记录一下自己的学习时长
1h
18.四数之和
● 今日学习的文章链接和视频链接
● 自己看到题目的第一想法
感觉会是三数之和的升级版。。。
● 看完代码随想录之后的想法
去重和剪枝发生改变。晕
● 自己实现过程中遇到哪些困难
看着边理解边敲了一遍,都挺费劲的。需要多敲几遍。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int k=0;k<nums.size();k++){
if(nums[k]>target && nums[k]>=0){
break;
}
if(k>0 && nums[k]==nums[k-1]){
continue;
}
for(int i=k+1;i<nums.size();i++){
if(nums[k]+nums[i]>target && nums[i]>0){
break;
}
if(i>k+1 && nums[i]==nums[i-1]){
continue;
}
int left = i+1;
int right = nums.size()-1;
while(right > left){
if((long)nums[k]+nums[i]+nums[left]+nums[right]>target){
right--;
}else if((long)nums[k]+nums[i]+nums[left]+nums[right]<target){
left++;
}else{
result.push_back(vector<int>{nums[k],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++;
}
}
}
}
return result;
}
};
● 今日收获,记录一下自己的学习时长
1h