1.基础知识
2.题目
2.1 四数相加II
思路:由于只需要的到多少个组合,而不需要得到对应的索引,可以使用unordered_map进行操作,只需要先遍历前两个数组,将所有的和的组合都按照<sum,count>的键值对形式储存下来。然后再遍历后两个数组,计算这两个数组元素的和num3+num4后,便可通过和零做差求得对应的num1+num2数值,再去对应的map中找到对应和出现的频次后相加即可。
class Solution
{
public:
int fourSumCount(vector<int> &nums1, vector<int> &nums2, vector<int> &nums3, vector<int> &nums4)
{
unordered_map<int, int> sums_map;
for (int num1 : nums1)
{
for (int num2 : nums2)
{
sums_map[num1 + num2]++;
}
}
int count = 0;
for (int num3 : nums3)
{
for (int num4 : nums4)
{
if (sums_map.find(0 - (num3 + num4)) != sums_map.end())
count += sums_map[0 - (num3 + num4)];
}
}
return count;
}
};
2.2 赎金信
思路:当遇到字符串相关,可以考虑使用哈希法来解决问题,这道题可以使用数组来代替map,因为已经确定了都是小写字母,所以能够确定数组的大小,比使用map更加高效
时间复杂度O(n)
空间复杂度O(1)
class Solution
{
public:
bool canConstruct(string ransomNote, string magazine)
{
// 剪枝,可以缩短耗时
if (ransomNote.size() > magazine.size())
return false;
int magazine_nums[26] = {0};
for (int i = 0; i < magazine.size(); i++)
{
magazine_nums[magazine[i] - 'a']++;
}
for (int j = 0; j < ransomNote.size(); j++)
{
magazine_nums[ransomNote[j] - 'a']--;
if (magazine_nums[ransomNote[j] - 'a'] < 0)
return false;
}
return true;
}
};