454.四数相加II :四数相加Ⅱ
思路:
1.对这四个数组怎样进行处理呢?分成两组,分别计算其加和,判断总和是否为零
2.因为要求记录个数,那么应该采用map类型了,key 用来记录 两数和, value 用来记录出现的次数
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> map1;
int count = 0;
for(int a : nums1) {
for(int b : nums2) {
map1[a + b]++;
}
}
for(int c : nums3) {
for(int d : nums4) {
if(map1.find(0 - (c + d)) != map1.end()) {
count += map1[0 - (c + d)];
}
}
}
return count;
383. 赎金信 :赎金信
沿用 242.有效的字母异位词 思路即可,用数记录每个字母的出现次数.
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size() > magazine.size()) return false;
unordered_map<char, int> map;
int record[26] = {0};
for(int i = 0; i < magazine.size(); i++) {
record[magazine[i] - 'a']++;
}
for(int i = 0; i < ransomNote.size(); i++) {
record[ransomNote[i] - 'a']--;
}
for(int i = 0; i < 26; i++) {
if(record[i] < 0) return false;
}
return true;
}
15. 三数之和 :三数之和 以及 18. 四数之和 :四数之和 ,目前按照我的水平,都算比较难的题目,一时也没有思路,只能按照对随想录的理解学习,权当做笔记了.(三数之和)
1.采用双指针法,在for循环中,先固定起始的一个数后,再移动两个指针,求和后判断与0的关系;
2.进行降重的操作,即分别考虑for循环初始值i 以及两个指针 left right 的操作;
判断nums[i] nums[i- 1] 之间不能重复;nums[left] nums[left + 1] nums[right] nums[righ - 1] 是否重复
3.在排序之后,对i 进行剪枝操作,即第一个元素大于零,之后的元素之和不可能小于零.
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++) {
if(nums[i] > 0) break;
if(i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while(left < right) {
if(nums[i] + nums[left] + nums[right] < 0) {
left++;
}else if(nums[i] + nums[left] + nums[right] > 0) {
right--;
}else {
result.push_back(vector<int>{nums[i], nums[left], nums[right]});
while(left < right && nums[right] == nums[right - 1]) right--;
while(left < right && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
return result;
}