算法记录Day 7 | 哈希表part02
LeetCode 454-四数相加II
题目链接:leetcode.cn/problems/4s…
题解
class Solution {
public:
int fourSumCount(vector<int> &nums1, vector<int> &nums2, vector<int> &nums3,
vector<int> &nums4) {
unordered_map<int, int> map1;
for (auto e1 : nums1) {
for (auto e2 : nums2) {
int sum = e1 + e2;
map1[sum]++;
}
}
int count = 0;
for (auto e3 : nums3) {
for (auto e4 : nums4) {
int target = -e3 - e4;
auto iter = map1.find(target);
if (iter != map1.end()) {
count += iter->second;
}
}
}
return count;
}
};
LeetCode 383-赎金信
题目链接:leetcode.cn/problems/in…
题解
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> map;
for (char c : magazine) {
map[c]++;
}
for (char c : ransomNote) {
auto iter = map.find(c);
if (iter != map.end()) {
if (iter->second < 1) {
return false;
} else {
map[c]--;
}
} else {
return false;
}
}
return true;
}
};
LeetCode 15-三数之和
题目链接:leetcode.cn/problems/3s…
题解
class Solution {
public:
vector<vector<int>> threeSum(vector<int> &nums) {
int a, b, c;
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (int i = 0; i < nums.size() - 2; i++) {
a = nums[i];
if (a > 0) {
return res;
}
if (i > 0 && a == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while (left < right) {
b = nums[left];
c = nums[right];
int sum = a + b + c;
if (sum == 0) {
vector<int> temp = {a, b, c};
res.push_back(temp);
while (left < right && b == nums[left]) {
left++;
}
while (left < right && c == nums[right]) {
right--;
}
} else if (sum > 0) {
right--;
} else if (sum < 0) {
left++;
}
}
}
return res;
}
};
LeetCode 18-四数之和
题目链接:leetcode.cn/problems/tw…
题解
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
if (nums.size() < 4) {
return vector<vector<int>>();
}
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (int i = 0; i < nums.size() - 3; i++) {
long n1 = nums[i];
if (i > 0 && n1 == nums[i - 1]) {
continue;
}
for (int j = i + 1; j < nums.size() - 2; j++) {
long n2 = nums[j];
if (j > i + 1 && n2 == nums[j - 1]) {
continue;
}
int l = j + 1, r = nums.size() - 1;
while (l < r) {
long n3 = nums[l], n4 = nums[r];
if (n1 + n2 + n3 + n4 == target) {
res.push_back({nums[i], nums[j], nums[l], nums[r]});
while (l < r && n3 == nums[l]) {
l++;
}
while (l < r && n4 == nums[r]) {
r--;
}
} else if (n1 + n2 + n3 + n4 < target) {
l++;
} else {
r--;
}
}
}
}
return res;
}
};