383.赎金信
简单题,直接用数组哈希表判断,和242.字母异位词一个思路
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> table(26,0);
for(int i=0;i<magazine.size();i++){
table[magazine[i]-'a']++;
}
for(int i=0;i<ransomNote.size();i++){
table[ransomNote[i]-'a']--;
if(table[ransomNote[i]-'a']<0){
return false;
}
}
return true;
}
};
15.三数之和&18.四数之和
重点题,两题思路一样,都是排序后双指针,关键在于对答案的去重操作,很精彩。
三数之和代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int len=nums.size();
for(int first=0;first<len;first++){
//对first去重,防止下标越界要确保first>0
if(first>0 && nums[first]==nums[first-1]){
continue;
}
int third=len-1;
int target=-nums[first];
for(int second=first+1;second<len;second++){
//对second去重
if(second>first+1&&nums[second]==nums[second-1]){
continue;
}
while(second<third && nums[second]+nums[third]>target){
third--;
}
if(second==third){
break;
}
if(nums[second]+nums[third]==target){
res.push_back({nums[first],nums[second],nums[third]});
}
}
}
return res;
}
};
四数之和代码
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
int len=nums.size();
sort(nums.begin(),nums.end());
for(int first=0;first<len-3;first++){
if(first>0&&nums[first]==nums[first-1]){
continue;
}
for(int second=first+1;second<len-2;second++){
if(second>first+1&&nums[second]==nums[second-1]){
continue;
}
long num=(long)target-(nums[first]+nums[second]);
int fourth=len-1;
for(int third=second+1;third<len-1;third++){
if(third>second+1 && nums[third]==nums[third-1]){
continue;
}
while(third<fourth&&nums[third]+nums[fourth]>num){
fourth--;
}
if(third==fourth){
break;
}
if(nums[third]+nums[fourth]==num){
res.push_back({nums[first],nums[second],nums[third],nums[fourth]});
}
}
}
}
return res;
}
};
我这两个代码统一了风格,基本做成了模板了,后面五数六数也是直接套用,里面还有一些剪枝操作,比如某些情况下可以直接跳出循环,或者直接下一轮循环,因为不影响时间复杂度,就没写。
454.四数相加II
另一种四数相加,和18.四数之和有区别,这里是在四个数组中寻找答案,且不用去重,操作起来更简单一点,用到了分组+哈希表
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> table;
for(int a:nums1){
for(int b:nums2){
table[a+b]++;
}
}
int res=0;
for(int c:nums3){
for(int d:nums4){
if(table[0-(c+d)]!=0){
res+=table[0-(c+d)];
}
}
}
return res;
}
};