第454题.四数相加II
答案里面的c++11那种写法还是不太适应
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int sum = 0;
int count = 0;
std:: unordered_map<int, int>map;
for (int i = 0; i < nums1.size(); i++) {
for (int j = 0; j < nums2.size(); j++) {
sum = nums1[i] + nums2[j];
map[sum] ++; //这句话的意思是如果sum没有出现则insert到map中,如果出现了,对他的value 做++;
}
}
int sum1 = 0;
for (int i = 0; i < nums3.size(); i++) {
for (int j = 0; j < nums4.size(); j++) {
sum1 = nums3[i] + nums4[j];
auto iter = map.find(0 - sum1);
if(iter != map.end()) {
count = count + iter->second;
}
}
}
return count;
}
};
383. 赎金信
数据量不大可以直接用数组,其他方法基本和之前那个242题目一样, 还是挺简单的
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int result[26] = {0};
for(int i = 0; i < magazine.size(); i++) {
result[magazine[i] - 'a']++;
}
for(int j = 0; j < ransomNote.size(); j++) {
result[ransomNote[j] - 'a']--;
}
for(int k = 0; k < 26; k++){
if (result[k] < 0) return false;
}
return true;
}
};
第15题. 三数之和
这道题用双指针法;注意这个题和之前题目的区别之处在于这是在同一个数组中选取元素,而且如果有好几个a都等于同一个数,或者好几个b等于同一个数,那么结果就会重复,题目说课不能重复,所以需要剪纸操作;注意双指针如果访问了所有元素也是O(n), 加上外循环的for,最后就会变成O(n2);
18. 四数之和
和上一个题差不多;有时间的时候写一写;变成了两层for循环,一层i=0; 第二层k= i+ 1; left = k+1;