454. 四数相加 II
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> mp;
//统计前2个数组的元素以及出现的次数
for (int it1: nums1)
for(int it2: nums2)
mp[it1 + it2]++;
int count = 0;
//遍历后2个数组记录并记录总和为0的个数
for (int it3: nums3)
for(int it4: nums4)
count += mp[-(it3 + it4)];
return count;
}
383. 赎金信
bool canConstruct(string ransomNote, string magazine) {
vector<int> mArr(26); //用于统计magazine中每个字符出现的次数
for (char it: magazine){
mArr[it - 'a']++;
}
//遍历ransomNote的每个元素,若是能被magazine表示则-1
for (char it :ransomNote){
mArr[it - 'a']--;
//如果 < 0,则表示magazine中的元素不够表示ransomNote
if (mArr[it - 'a'] < 0) return false;
}
return true;
}
15. 三数之和
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<vector<int>> ans;
// i 截止到倒数第三个,防止溢出
for(int i = 0; i < n-2; ++i){
int x = nums[i];
if (i && x == nums[i-1]) continue; // 跳过重复数字
if(x + nums[i+1] + nums[i+2] > 0) break; //优化1
if (x + nums[n - 2] + nums[n - 1] < 0) continue; // 优化二
int j = i+1, k = n-1;
while(j < k) {
int sum = x + nums[j] + nums[k];
if (sum > 0) --k;
else if (sum < 0) ++j;
//如果满足条件,加入nums
else {
ans.push_back({x, nums[j], nums[k]});
//防止j、k重复
for(++j; j < k && nums[j]==nums[j-1]; ++j) ;
for(--k; j < k && nums[k]==nums[k+1]; --k) ;
}
}
}
return ans;
}
18. 四数之和
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); k++){
//剪枝操作
if (nums[k] > target && nums[k] >= 0) break;
//去重
if (k > 0 && nums[k] == nums[k-1]) continue;
for (int i = k+1; i < nums.size(); i++) {
//2级剪枝
if (nums[k] + nums[i] > target && nums[k]+nums[i]>=0) break;
//2级去重
if (i > k+1 && nums[i] == nums[i-1]) continue;
int left = i+1, right = nums.size()-1;
while(left < right) {
//如果 总和 > target, right--
if ((long)nums[k] + nums[i] + nums[left] + nums[right] > target) {
right--;
}else if ((long)nums[k] + nums[i] + nums[left] + nums[right] < target) {
//如果 总和 < target, left++
left++;
}else {
result.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});
//去重
while(left < right && nums[left] == nums[left+1]) left++;
while(left < right && nums[right] == nums[right-1]) right--;
left++;
right--;
}
}
}
}
return result;
}