第454题.四数相加II
第454题.四数相加II
条件:四个数组中分别取一个,相加和为0,求满足条件的元组个数
思路使用1个map,mapA保存 s1 s2中相加和及其出现次数
遍历s3 s4,去判断是否满足 0 - (s3[i] + s4[j]) 在mapA中,并统计出现次数
int getSumIndexFourthArrays(vector<int> nums1, vector<int> nums2, vector<int> nums3, vector<int> nums4)
{
//
map<int, int> mapA;
for (auto valA: nums1) {
for (auto valB : nums2) {
if (mapA.find(valA + valB) != mapA.end()){
mapA[valA + valB]++;
} else {
mapA[valA + valB] = 1;
}
}
}
int count = 0;
for (auto valC : nums3) {
for (auto valD : nums4) {
int sum = valC + valD;
if (mapA.find(0 - sum) != mapA.end()){
count += mapA[0 - sum];
}
}
}
return count;
}
383. 赎金信
383. 赎金信
题目要求,s1 是否能由s2中的字符组成,s2中每个字符只能使用一次,仅有小写字母
使用26个字母数组,记录所有s2中字符,再遍历s1减少数组相应字符个数
bool canConstruct(string ransomNote, string magazine)
{
if (magazine.size() < ransomNote.size())
return false;
int arr[26] = {0};
for (int i = 0; i < magazine.size(); ++i) {
arr[magazine[i] - 'a'] += 1;
}
for (int i = 0; i < ransomNote.size(); ++i) {
arr[ransomNote[i] - 'a']--;
if (arr[ransomNote[i] - 'a'] < 0) {
return false;
}
}
return true;
}
第15题. 三数之和
第15题. 三数之和
本题的解题思路是先排序,然后移动left right指针,去除重复 ,因为是有序的,所以会有 nums[i] <= nums[left] <= nums[right]
// 没有正确的进行去除重复
vector<vector<int>> threeSum(vector<int> nums)
{
vector<vector<int>> ret;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
int left = i + 1;
int 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 {
ret.push_back(vector<int> {nums[i], nums[left], nums[right]});
left++;
right--;
}
}
}
return ret;
}
第18题. 四数之和
第18题. 四数之和
本题的解题思路是在3数之和的基础上再套个for循环文章来源:https://www.toymoban.com/news/detail-661534.html
vector<vector<int>> thourSums(vector<int> nums, int target)
{
vector<vector<int>> ret;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
for (int j = i + 1; j < nums.size(); ++j) {
int left = j + 1;
int right = nums.size() - 1;
while (left != right) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) {
right--;
}
else if (sum < target) {
left++;
}
else {
ret.push_back(vector<int> {nums[i], nums[j], nums[left], nums[right]});
left++;
right--;
}
}
}
}
return ret;
}
总结
本篇的几道题目思路是不一样的,其中 第454题.四数相加II 和 383. 赎金信是典型的哈希表应用,而 第15题. 三数之和 使用哈希表也能解,但是解题过程有复杂的逻辑处理,而使用双指针则会高效得多。第18题. 四数之和则是在三数之和的基础上再次套了一个for循环。文章来源地址https://www.toymoban.com/news/detail-661534.html
到了这里,关于代码随想录-哈希表02 第454题.四数相加II&383. 赎金信&第15题. 三数之和&第18题. 四数之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!