昨天做市调赛PPT,今天起晚了,中午14.30才开始训练。总之有收获就是最好的。
DAY7
454四数相加
Map怎么用?朴素法也设计不出来。看了题解之后,自己写了一遍,通过了,等待二刷。
- class Solution {
- public:
- int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
- unordered_map<int,int> m;
- int cnt=0;
- for(int i=0;i<nums1.size();i++)
- {
- for(int j=0;j<nums2.size();j++)
- m[nums1[i]+nums2[j]]++;
- }
- for(int i=0;i<nums3.size();i++)
- {
- for(int j=0;j<nums4.size();j++)
- if(m.find(0-(nums3[i]+nums4[j]))!=m.end()) cnt+=m[0-(nums3[i]+nums4[j])];
- }
- return cnt;
- }
- };
383赎金信
- class Solution {
- public:
- bool canConstruct(string ransomNote, string magazine) {
- int r[26]={0},m[26]={0};
- for(char c:ransomNote) r[c-'a']++;
- for(char c:magazine) m[c-'a']++;
- for(int i=0;i<26;i++)
- {
- if(r[i]==0) continue;
- if(r[i]>m[i]) return false;
- }
- return true;
- }
- };
15三数之和
不会,还得学呀。待二刷。
- class Solution {
- public:
- vector<vector<int>> threeSum(vector<int>& nums) {
- //该怎么初始化符合题意的res二维vector?怎么写psuh_back?
- vector<vector<int>> res;
- sort(nums.begin(),nums.end());
- for(int i=0;i<nums.size();i++)
- {
- if(nums[i]>0) {return res;}
- if(i>0&&nums[i]==nums[i-1]) {continue;}
- int l=i+1,r=nums.size()-1;
- while(l<r)
- {
- if(nums[i]+nums[l]+nums[r]>0) r--;
- else if(nums[i]+nums[l]+nums[r]<0) l++;
- else
- {
- res.push_back(vector<int>{nums[i],nums[l],nums[r]});
- while(r>l&&nums[l]==nums[l+1]) l++;
- while(r>l&&nums[r]==nums[r-1]) r--;
- r--;
- l++;
- }
- }
- }
- return res;
- }
- };
18四数之和
多学。看了代码随想录的解析。注意减枝和去重别写错。等待二刷
- class Solution {
- public:
- vector<vector<int>> fourSum(vector<int>& nums, int target) {
- vector<vector<int>> res;
- sort(nums.begin(),nums.end());
- for(int i=0;i<nums.size();i++)
- {
- //剪枝
- if(nums[i]>target&&nums[i]>=0) break;
- //去重
- if(i>0&&nums[i]==nums[i-1]) continue;
- for(int k=i+1;k<nums.size();k++)
- {
- //剪枝
- if((nums[k]+nums[i])>target&&(nums[i]+nums[k])>=0) break;
- //去重
- if(k>(i+1)&&nums[k]==nums[k-1]) continue;
- int l=k+1;
- int r=nums.size()-1;
- while(l<r)
- {
- if((long)nums[k]+nums[i]+nums[l]+nums[r]>target) r--;
- else if((long)nums[k]+nums[i]+nums[l]+nums[r]<target) l++;
- else{
- res.push_back({nums[k],nums[i],nums[l],nums[r]});
- while(l<r&&nums[r]==nums[r-1]) r--;
- while(l<r&&nums[l]==nums[l+1]) l++;
- l++;
- r--;
- }
- }
- }
- }
- return res;
- }
- };