1. 程式人生 > >[LeetCode] Two Sum III

[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;
};

類似題目:

參考資料: