[LeetCode] Two Sum III
Design and implement a TwoSum class. It should support the following operations:add and find.
add - Add the number to an internal data structure.
find - Find if there exists any pair of numbers which sum is equal to the value.
For example,
add(1); add(3); add(5);
find(4) -> true
find(7) -> false
這道題讓我們設計一個Two Sum的資料結構,跟LeetCode的第一道題Two Sum沒有什麼太大的不一樣,作為LeetCode的首題,Two Sum的名氣不小啊,正所謂平生不會TwoSum,刷盡LeetCode也枉然。記得原來在背單詞的時候,總是記得第一個單詞是abandon,結果有些人背來背去還在abandon,有時候想想刷題其實跟背GRE紅寶書沒啥太大的區別,都是一個熟練功夫,並不需要有多高的天賦,只要下足功夫,都能達到一個很不錯的水平,套用一句雞湯問來激勵下吧,“有些時候我們的努力程度根本達不到需要拼天賦的地步”,好了,不閒扯了,來看題吧。不過這題也沒啥可講的,會做Two Sum的這題就很簡單了,我們先來看用雜湊表的解法,我們把每個數字和其出現的次數建立對映,然後我們遍歷雜湊表,對於每個值,我們先求出此值和目標值之間的差值t,然後我們需要分兩種情況來看,如果當前值不等於差值t,那麼只要雜湊表中有差值t就返回True,或者是當差值t等於當前值時,如果此時雜湊表的對映次數大於1,則表示雜湊表中還有另一個和當前值相等的數字,二者相加就是目標值,參見程式碼如下:
解法一:
class TwoSum { public: void add(int number) { ++m[number]; } bool find(int value) { for (auto a : m) { int t = value - a.first; if ((t != a.first && m.count(t)) || (t == a.first && a.second > 1)) {return true; } } return false; } private: unordered_map<int, int> m; };
另一種解法不用雜湊表,而是unordered_multiset來做,但是原理和上面一樣,參見程式碼如下:
解法二:
class TwoSum { public: void add(int number) { s.insert(number); } bool find(int value) { for (auto a : s) { int cnt = a == value - a ? 1 : 0; if (s.count(value - a) > cnt) { return true; } } return false; } private: unordered_multiset<int> s; };
類似題目:
參考資料: