[LeetCode] 170. Two Sum III - Data structure design 兩數之和之三 - 數據結構設計


 

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.

Example 1:

add(1); add(3); add(5);
find(4) -> true
find(7) -> false

Example 2:

add(3); add(1); add(2);
find(3) -> true
find(6) -> false

 

這道題讓我們設計一個 Two Sum 的數據結構,跟 LeetCode 的第一道題 Two Sum 沒有什么太大的區別,作為 LeetCode 的首題,Two Sum 的名氣不小啊,正所謂平生不會 TwoSum,刷盡 LeetCode 也枉然。記得原來在背單詞的時候,總是記得第一個單詞是 abandon,結果有些人背來背去還在 abandon,有時候想想刷題其實跟背 GRE 紅寶書沒啥太大的區別,都是一個熟練功夫,並不需要有多高的天賦,只要下足功夫,都能達到一個很不錯的水平,套用一句雞湯問來激勵下吧,“有些時候我們的努力程度根本達不到需要拼天賦的地步”,好了,不閑扯了,來看題吧。不過這題也沒啥可講的,會做 Two Sum 的這題就很簡單了,先來看用 HashMap 的解法,把每個數字和其出現的次數建立映射,然后遍歷 HashMap,對於每個值,先求出此值和目標值之間的差值t,然后需要分兩種情況來看,如果當前值不等於差值t,那么只要 HashMap 中有差值t就返回 True,或者是當差值t等於當前值時,如果此時 HashMap 的映射次數大於1,則表示 HashMap 中還有另一個和當前值相等的數字,二者相加就是目標值,參見代碼如下:

 

解法一:

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

 

另一種解法不用 HashMap,而是 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;
};

 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/170

 

類似題目:

Two Sum

Unique Word Abbreviation

Two Sum IV - Input is a BST

 

參考資料:

https://leetcode.com/problems/two-sum-iii-data-structure-design/

https://leetcode.com/problems/two-sum-iii-data-structure-design/discuss/52015/Beats-100-Java-Code

https://leetcode.com/problems/two-sum-iii-data-structure-design/discuss/52035/My-solutions-in-Java-C%2B%2B-and-Python.-O(1)-time-for-add-O(n)-time-for-find-O(n)-space

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM