Day 7 哈希表
454. 四数相加II
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
int len = nums1.size(), rst = 0;
unordered_map<int, int> table;
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
table[nums1[i] + nums2[j]]++;
}
}
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
auto iter = table.find(-(nums3[i] + nums4[j]));
if (iter != table.end())
{
rst += iter->second;
}
}
}
return rst;
}
};
383. 赎金信
哈希表方法
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> table;
for (auto c : magazine)
{
table[c]++;
}
for (auto c : ransomNote)
{
table[c]--;
if (table[c] < 0)
{
return false;
}
}
return true;
}
};
数组方法
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> table(26, 0);
for (auto c : magazine)
{
table[c - 'a']++;
}
for (auto c : ransomNote)
{
table[c - 'a']--;
if (table[c - 'a'] < 0)
{
return false;
}
}
return true;
}
};
15. 三数之和
第一感觉是用回溯的方法,但是细想,这一章是哈希表,应该考虑怎么跟哈希表扯上关系。看了提示,意思是说哈希表解决这个问题有点麻烦,还是用双指针更好。
涉及到去重,往往都需要进行一次排序
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> table;
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, right = nums.size() - 1;
while (left < right)
{
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0)
{
right--;
}
else if (sum < 0)
{
left++;
}
else
{
table.push_back({nums[i], nums[left], nums[right]});
while (left < right && nums[right] == nums[right - 1]) right--;
while (left < right && nums[left] == nums[left + 1]) left++;
left++;
right--;
}
}
}
return table;
}
};
18. 四数之和
这里比较折磨人的是类型值溢出的问题
比如说这个案例
nums = [0,0,0,1000000000,1000000000,1000000000,1000000000]
target = 1000000000
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> table;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] > 0 && nums[i] > target) break;
if (i > 0 && nums[i] == nums[i - 1]) continue;
for (int j = i + 1; j < nums.size(); j++)
{
if (j > i + 1 && nums[j] == nums[j - 1]) continue;
int left = j + 1, right = nums.size() - 1;
while (left < right)
{
long sum = (long)nums[i] + nums[j] + nums[left] + nums[right]; // 使用int会溢出
if (sum > target)
{
right--;
}
else if (sum < target)
{
left++;
}
else
{
table.push_back({nums[i], nums[j], 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 table;
}
};