第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
)