代码随想录第7天 哈希表相关题目(2)
继续学习和熟悉map set的相关用法
454. 四数相加 II - 力扣(LeetCode)
先把前两个数的和以及出现的个数存在map中,然后遍历后面两个数组,在map中看看是否能匹配到四数和为零,如果为零,给结果加上键值对value(出现的次数)
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int,int> map;
for(int a:nums1){
for(int b:nums2){
map[a+b]++;
}
}
int cou=0;
for(int c:nums3){
for(int d:nums4){
if(map.find(0-c-d)!=map.end()){
cou=cou+map[0-c-d];
}
}
}
return cou;
}
};
383. 赎金信 - 力扣(LeetCode)
很简单,搞一个数组就行,和242. 有效的字母异位词 - 力扣(LeetCode)很像
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int a[26];
int b[26];
for(char s:ransomNote){
a[s-'a']++;
}
for(char s:magazine){
b[s-'a']++;
}
for(int i=0;i<26;i++){
if(a[i]>b[i]){
return false;
}
}
return true;
}
};
15. 三数之和 - 力扣(LeetCode)
梦破碎的地方!| LeetCode:15.三数之和_哔哩哔哩_bilibili用哈希的话,去重操作比较复杂,这里用双指针进行操作,在循环的过程中对三个元素进行去重
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]>0){
return res;
}
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) right--;
else if (nums[i] + nums[left] + nums[right] < 0) left++;
else {
res.push_back(vector<int>{nums[i], nums[left], nums[right]});
// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
// 找到答案时,双指针同时收缩
right--;
left++;
}
}
}
return res;
}
};