454. 四数相加
题目
思路
这道题相当于是两数相加的加强版,其实大体思路是一致的,只不过这道题里先把四个数组中的数两两相加,把和作为map的key值,把和出现的次数作为value,这样先遍历完前两个数组,后面再遍历剩余数组时,也是将数组两两相加,不过这次的和就需要用来被0减了,这样就可以知道前两个数组和中有哪些可以和这两个的数组和相加为0,将所有符合条件的value累加,最后就能得到答案了。
代码
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. 赎金信
题目
思路
难得又一道自己AC出来的题,虽然只是简单题,但说明我有学以致用!
这道题似曾相识,和之前做过的有效异位词相似,其实就是给出字符串A和B,判断A是不是包含于B,注意要用B中的字母组成A,而且字母的数量也得够,所以这里我就先将B里字母对应的数字作为map的key,字母的数量作为map的value,遍历完B后就得到map,接下来再遍历一下A,如果A中出现了某个map中的key,就将对应的value减一,到最后如果减得一个不剩,那就说明B包含A。
代码
class Solution {
public:
bool canConstruct(string ransomNote, string magzine) {
unordered_map<int, int> umap;
for (int i = 0; i < ransomNote.size(); i++) {
umap[ransomNote[i] - 'a']++;
}
for (int i = 0; i < magzine.size(); i++) {
if (umap.find(magzine[i] - 'a') != umap.end() && umap[magzine[i] - 'a'] > 0) {
umap[magzine[i] - 'a']--;
}
}
for (int i = 0; i < 26; i++) {
if (umap[i] != 0) {
return false;
}
}
return true;
}
};