day6 hash表

zhangenigma發表於2024-06-12

題目:

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當成一個整體來判斷。
感覺我需要把三數之和寫熟練了再來補這裡的感悟。

相關文章