代码随想录-哈希表02 第454题.四数相加II&383. 赎金信&第15题. 三数之和&第18题. 四数之和

第454题.四数相加II

第454题.四数相加II

条件:四个数组中分别取一个,相加和为0,求满足条件的元组个数

思路使用1个map,mapA保存 s1 s2中相加和及其出现次数

遍历s3 s4,去判断是否满足 0 - (s3[i] + s4[j]) 在mapA中,并统计出现次数

c++ 复制代码
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减少数组相应字符个数

c++ 复制代码
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]

// 没有正确的进行去除重复

c++ 复制代码
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循环

c++ 复制代码
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题.四数相加II383. 赎金信 是典型的哈希表应用,而 第15题. 三数之和 使用哈希表也能解,但是解题过程有复杂的逻辑处理,而使用双指针则会高效得多。第18题. 四数之和则是在三数之和的基础上再次套了一个for循环。

相关推荐
木心月转码ing1 小时前
Hot100-Day24-T128最长连续序列
算法
小肥柴1 小时前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
学高数就犯困4 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
xlp666hub6 小时前
Leetcode第七题:用C++解决接雨水问题
c++·leetcode
CoovallyAIHub7 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
肆忆_8 小时前
实战复盘:手写 C++ 虚拟机的高性能并行 GC (Thread Pool + Work Stealing)
c++
肆忆_8 小时前
虚函数进阶答疑:把上一篇博客评论区里最容易卡住的问题,一次追到底
c++
颜酱19 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法