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

454. 四数相加 II

题目链接

454. 四数相加 II - 力扣(LeetCode)

思路

这道题目的暴力解法是O(n^4),可以与两数之和一样使用哈希法解决,但是必要两个嵌套for循环了!

这道题可以采用的哈希结构为map类型的,key值作元素值,value值作为同一个key值出现的次数

本人题解

class Solution {
public:
    int fourSumCount(vector& nums1, vector& nums2, vector& nums3, vector& nums4) {
        //2024.2.27二刷
        //这道题目的暴力解法是O(n^4),可以与两数之和一样使用哈希法解决,但是必要两个for循环了!
        //这道题可以采用的哈希结构为map类型的,key值作元素值,value值作为同一个key值出现的次数
        //因此用的是unordered_map
        unordered_map mymap;
        //首先遍历前两个数组
        for (int i = 0; i < nums1.size(); i++) {
            for (int j = 0; j < nums2.size(); j++) {
                mymap[-nums1[i] - nums2[j]]++;//这个存数据的方式太巧妙了!
            }
        }
        int count = 0;//统计个数
        for (int i = 0; i < nums3.size(); i++) {
            for (int j = 0; j < nums4.size(); j++) {
                if (mymap.find(nums3[i] + nums4[j]) != mymap.end()) {
                    count += mymap[nums3[i] + nums4[j]];
                }
            }
        }
        return count;
    }
};

383. 赎金信

题目链接

383. 赎金信 - 力扣(LeetCode)

思路

这道题有哈希法的影子!与字母异位那题很像。由题知不可重复,采用数组

本人题解

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        //这道题有哈希法的影子!与字母异位那题很像。由题知不可重复,
        //采用数组
        int record[26] = {0};//初始化为0
        for (int i = 0; i < ransomNote.size(); i++) {
            record[ransomNote[i] - 'a']++;
        }
        for (int j = 0; j < magazine.size(); j++) {
            record[magazine[j] - 'a']--;
        }
        for (int k = 0; k < 26; k++) {
            if (record[k] > 0) return false;
        }
        return true;
    }
};

15. 三数之和

题目链接

15. 三数之和 - 力扣(LeetCode)

思路

想到了哈希法,但是不太会做。

本人题解

18. 四数之和

题目链接

18. 四数之和 - 力扣(LeetCode)

思路

同三数之和

本人题解

你可能感兴趣的:(代码随想录算法训练营刷题,算法)