Day.6 | 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

454.四数相加II

要点:在4个数组中分别取一个数,让4个数相加为0,感觉与target=0的两数相加有点类似,不需要输出每个数字的下标,那么让4个数组两两一组(这样做可以让时间复杂度最小),每组两层遍历,找所有和的组合,再找两个和为0的次数

方法:

1. num1 和 num2 一组,各取一数找sum的个数和sum分别出现的次数

2. num3 和 num4 同上,在求sum的时候判断sum的相反数是否已经在第一步出现过

3. 统计出现过的次数

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3,
                     vector<int>& nums4) {
        unordered_map<int, int> umap;
        for (int a : nums1) {
            for (int b : nums2) {
                umap[a + b]++;
            }
        }
        int count = 0;
        for (int c : nums3) {
            for (int d : nums4) {
                if (umap.find(0 - c - d) != umap.end()) {
                    count += umap[0 - c - d];
                }
            }
        }
        return count;
    }
};

383.赎金信

要点:与有效的字母异位词类似,判断a字符串能否由b字符串组成,且都只有小写字母,那么就记录b字符串中各个字母出现的次数,再遍历a字符串,看b记录的字母够不够用,不够用就false

方法:

1. 用数组记录b字符串中各字母出现的次数(用map也可以,但是消耗空间会更多点)

2. 遍历a字符串去消耗

3. 感觉像一个存钱 -> 花钱的过程

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int record[26] = {0};
        if (ransomNote.size() > magazine.size()) {
            return false;
        }
        for (int i = 0; i < magazine.length(); i++) {
            record[magazine[i] - 'a']++;
        }
        for (int j = 0; j < ransomNote.length(); j++) {
            record[ransomNote[j] - 'a']--;
            if (record[ransomNote[j] - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

15.三数之和

要点:

方法:

18.四数之和

要点:

方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值