[LeetCode] 優化 LeetCode 的解答,與 hashmap 另類解法 #18 4Sum

LeetCode 上 第一個解答 已經夠快了,一丟就 8ms,但我們有沒有辦法找出更快的解法? Profile 看看問題出在哪 用 Callgrind profile 一下發現他花了很多力氣在存取 nums array 和 destruct vector 上: 而且程式花了大部分的力氣在跑 twoSum : 看到 Self 那麼多 instructions 就代表大部分運算都卡在 twoSum 。 所以如果我們想要優化這個解法,我們可以用以下任何手段來達成: 減少 nums 被存取的次數 減少 create vectors,這樣就間接減少了 vector<>::~vector() 的機會 盡量少呼叫 twoSum 如何先刪除重複的數字? 因為 input 有可能有重複的數字,所以其實我們很常這樣寫來跳過重複的數字: if (... || nums[i - 1] != nums[i]) ... if (... || (lo > start && nums[lo] == nums[lo - 1])) ... if (... || (... && nums[hi] == nums[hi + 1])) ... 如果跑過 N 個數字,我們其實要存取 vector 2N 次,你可以用一個 variable 暫存上一個數字,可是你還是躲不過和上個數字比較。 可是我今天要介紹一個算是技巧嗎? 還是暴力解? 我們連比較都不用,因為我們把重複的數字都先刪掉了。 可是如果 input 有重複的數字,我們要怎麼輸出可能重複 2~4 次的數字? 窮舉重複數字 我們就先把這些答案先輸出就好了,想法就是我們把 4 個數字的各種多個數字重複的可能窮舉出來: a + a + a + a = target a + (b + b + b) = target (b + b + b) + a = target (a + a) + (b + b) = target (a + a) + b + c = target a + (b + b) + c = target a + b + (c + c) = target a + b + c + d = target 而且有一個條件 (requirement) 就是 a < b < c <...