題目:
https://leetcode.cn/problems/4sum-ii/submissions/539038029/
解析:
https://programmercarl.com/0454.四數相加II.html#演算法公開課
感覺能做出來,但是沒有,這個思路是兩個數為一組採用兩個for迴圈記錄和,放入map中,其中,map first為和,map second為和的數量;
第三第四個數的和為前兩個數的相反數,如成立,則加和;
題目:
https://leetcode.cn/problems/ransom-note/submissions/539042243/
解析:
https://programmercarl.com/0383.贖金信.html
這道題採用與“有效的字母異位詞”相似的解法,在最後判斷時
for(int i = 0; i < 26; i++) {
// std::cout << record[i] << std::endl;
if(record[i] < 0) {
return false;
}
}
// 採用的是<0而不是!=0
真是不容易,第一次做出來;
題目:
https://leetcode.cn/problems/3sum/submissions/539046563/
解析:
https://programmercarl.com/0015.三數之和.html#演算法公開課
這種題,包括下面的四數之和不是我現在能做出來的;
直接看的解析,這裡記錄一下感受,希望對下次解有幫助。動力源為遍歷的i,其餘兩個指標left,right隨著i變化而變化。
這道題框架還很好理解,真正的靈魂是剪枝和去重,剪枝也還好;去重有兩個需要注意的地方,i的去重是和前面的比,而不是和後面的比,為啥呢;
因為前面的已經處理過了,不會遺漏。再一個後面採用while去重時一定要有邊界條件(right > left)
while(right > left && nums[right] == nums[right - 1]) right--;
while(right >left && nums[left] == nums[left + 1]) left++;
沒有邊界條件的話,直接報vector處理有問題,應該是跑出邊界了。
這道題得多複習一下。
題目:
https://leetcode.cn/problems/4sum/submissions/539051337/
解析:
https://programmercarl.com/0018.四數之和.html
框架與第三題一致,其中k也需要去重和剪枝,這道題也是磕磕絆絆地抄了半天才能編譯透過,我感悟還不深,只知道這裡不是0,是target,要判斷其正負;
i的去重和剪枝是和k當成一個整體來判斷。
感覺我需要把三數之和寫熟練了再來補這裡的感悟。