代码随想录算法训练营第七天|第454题.四数相加II,383. 赎金信,第15题. 三数之和

VickyWu / 2024-10-08 / 原文

第454题.四数相加II

文章链接:https://programmercarl.com/0454.四数相加II.html
视频讲解:https://www.bilibili.com/video/BV1Md4y1Q7Yh/
题目链接:https://leetcode.cn/problems/4sum-ii/description/

题目思路:

  • 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  • 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  • 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  • 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  • 最后返回统计值 count 就可以了

总结:map中key存a+b的和,value存出现该key的次数。

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        //两组两组的进行计算比较
        unordered_map<int,int> map; //存放前两组的元素之和
        int count=0;  //统计有多少组符合条件的四元组
        for(int num1:nums1){
            for(int num2:nums2){
                map[num1+num2]++;
            }
        }
        for(int num3:nums3){
            for(int num4:nums4){
                if(map.find(0-num3-num4)!=map.end()){  //如果找到了
                    count+=map[0-num3-num4];
                }
            }
        }
        return count;
    }
};

383. 赎金信

文章链接:https://programmercarl.com/0383.赎金信.html#思路
题目链接:https://leetcode.cn/problems/ransom-note/description/

总结:这里我用的是哈希表,但其实在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<char,int> map; //key为出现的字符,value为字符的数量
        for(int i=0;i<magazine.size();i++){
            map[magazine[i]]++;
        }
        for(int j=0;j<ransomNote.size();j++){
            if(map.find(ransomNote[j])!=map.end()){ //如果找到了
                int num=map.find(ransomNote[j])->second;
                if(num>0) map[ransomNote[j]]--;
                else return false;
            }
            else return false; //如果没找到,返回false
        }
        return true;
    }
};

第15题. 三数之和

文章链接:https://programmercarl.com/0015.三数之和.html
视频链接:https://www.bilibili.com/video/BV1GW4y127qo/?vd_source=6cb513d59bf1f73f86d4225e9803d47b
题目链接:https://leetcode.cn/problems/3sum/description/

双指针法总结:

  • 首先对数组进行排序(为了方便进行后续的操作判断)
  • 如果将得到的结果按照非降序的顺序表示为
  • 首先对a进行去重(因为如果是非降序的,那么就有可能会有连续的一样的a值,eg.-1,-1,0,1,2。但一个a值就是我们统计的其中一种方案,必然导致重复)
  • 接着对b和c进行去重(因为可能会导致如下情况:eg.-1,-2,-2,0,0,3,3)