代码随想录算法训练营 Day7
- 知识点
- 哈希表进阶
- 双指针
454.四数相加II
代码随想录链接:
题目链接/文章讲解/视频讲解
重点:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样
- 思路:
- nums1[i] + nums2[j] == -nums3[k] -nums4[l]
n*n
种情况 ==n*n
种情况
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> umap;
int count = 0;
for (int a : nums1) {
for (int b : nums2)
umap[a+b]++;
}
for (int c : nums3)
for (int d : nums4) {
if (umap.find(-c-d) != umap.end())
count+=umap[-c-d]; /
}
return count;
}
};
- 为什么是+=umap[-c-d]而不是++?
因为可能a+b有相同的值,那么所有满足的-c-d都可以
383. 赎金信
代码随想录链接:
题目链接/文章讲解
建议:本题 和 242.有效的字母异位词 是一个思路 ,算是拓展题
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
// magazine为set
int hash[26];
for (int i = 0; i < magazine.size(); i++) {
hash[magazine[i]-'a']++;
}
for (int i = 0; i < ransomNote.size(); i++) {
hash[ransomNote[i]-'a']--;
if (hash[ransomNote[i]-'a'] < 0) return false;
}
return true;
}
};
15. 三数之和
代码随想录链接:
题目链接/文章讲解/视频讲解
建议:用双指针法,哈希法很麻烦。
!!!关键:去重
-
判断
nums[i] == nums[i+1]
还是nums[i] == nums[i-1]
?是nums[i]和nums[i-1]:是和前面的作比较
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
// a + b = -c
// 1. 暴力法,3层循环
// 2. 双指针
// nums[i] +nums[left] - nums[right]
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
// 排序后不可能三数中最小数还为正数
if (nums[i] > 0) return ans;
// 去重
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 {
ans.push_back(vector<int>{nums[i], nums[left], nums[right]});
// 后两个数去重
while (right > left && nums[right] == nums[right-1]) right--;
while (right > left && nums[left] == nums[left+1]) left++;
left++;
right--;
}
}
}
return ans;
}
};
[TODO]:
18. 四数之和