454.四数相加II
要点:在4个数组中分别取一个数,让4个数相加为0,感觉与target=0的两数相加有点类似,不需要输出每个数字的下标,那么让4个数组两两一组(这样做可以让时间复杂度最小),每组两层遍历,找所有和的组合,再找两个和为0的次数
方法:
1. num1 和 num2 一组,各取一数找sum的个数和sum分别出现的次数
2. num3 和 num4 同上,在求sum的时候判断sum的相反数是否已经在第一步出现过
3. 统计出现过的次数
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3,
vector<int>& nums4) {
unordered_map<int, int> umap;
for (int a : nums1) {
for (int b : nums2) {
umap[a + b]++;
}
}
int count = 0;
for (int c : nums3) {
for (int d : nums4) {
if (umap.find(0 - c - d) != umap.end()) {
count += umap[0 - c - d];
}
}
}
return count;
}
};
383.赎金信
要点:与有效的字母异位词类似,判断a字符串能否由b字符串组成,且都只有小写字母,那么就记录b字符串中各个字母出现的次数,再遍历a字符串,看b记录的字母够不够用,不够用就false
方法:
1. 用数组记录b字符串中各字母出现的次数(用map也可以,但是消耗空间会更多点)
2. 遍历a字符串去消耗
3. 感觉像一个存钱 -> 花钱的过程
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.length(); i++) {
record[magazine[i] - 'a']++;
}
for (int j = 0; j < ransomNote.length(); j++) {
record[ransomNote[j] - 'a']--;
if (record[ransomNote[j] - 'a'] < 0) {
return false;
}
}
return true;
}
};
15.三数之和
要点:
方法:
18.四数之和
要点:
方法:
897

被折叠的 条评论
为什么被折叠?



