程式碼隨想錄演算法訓練營第七天|第454題.四數相加II,383. 贖金信,第15題. 三數之和

W-Vicky11發表於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)

相關文章