力扣 170. 兩數之和 III - 資料結構設計 two-sum III

老马啸西风發表於2024-11-11

陣列系列

力扣資料結構之陣列-00-概覽

力扣.53 最大子陣列和 maximum-subarray

力扣.128 最長連續序列 longest-consecutive-sequence

力扣.1 兩數之和 N 種解法 two-sum

力扣.167 兩數之和 II two-sum-ii

力扣.170 兩數之和 III two-sum-iii

力扣.653 兩數之和 IV two-sum-IV

力扣.015 三數之和 three-sum

力扣.016 最接近的三數之和 three-sum-closest

力扣.259 較小的三數之和 three-sum-smaller

題目

題目描述
設計一個接收整數流的資料結構,該資料結構支援檢查是否存在兩數之和等於特定值。

實現 TwoSum 類:

TwoSum() 使用空陣列初始化 TwoSum 物件

void add(int number) 向資料結構新增一個數 number

boolean find(int value) 尋找資料結構中是否存在一對整數,使得兩數之和與給定的值相等。如果存在,返回 true ;否則,返回 false 。

示例:

輸入:
["TwoSum", "add", "add", "add", "find", "find"]
[[], [1], [3], [5], [4], [7]]
輸出:
[null, null, null, null, true, false]

解釋:

TwoSum twoSum = new TwoSum();
twoSum.add(1);   // [] --> [1]
twoSum.add(3);   // [1] --> [1,3]
twoSum.add(5);   // [1,3] --> [1,3,5]
twoSum.find(4);  // 1 + 3 = 4,返回 true
twoSum.find(7);  // 沒有兩個整數加起來等於 7 ,返回 false

思路

這一題和 001 第一題是一樣的,可以參考 T001 和 T167 的解法,這裡把這一題單獨拿出來只是為了學習的系統性。

所以不做過多的展開。

區別

這一題還有一個核心的區別是資料會一直變化,所以陣列的排序會打折扣。

當然也可以調整為對應的插入排序等演算法。

常見演算法

  1. 暴力

2)藉助 Hash

  1. 排序+二分

4)雙指標==》針對有序陣列

在這個場景裡面,最簡單好用的應該是 HashMap 的方式

實現

class TwoSum {
    private Map<Integer, Integer> cnt = new HashMap<>();

    public TwoSum() {
    }

    public void add(int number) {
        cnt.merge(number, 1, Integer::sum);
    }

    public boolean find(int value) {
        for (var e : cnt.entrySet()) {
            int x = e.getKey(), v = e.getValue();
            int y = value - x;
            if (cnt.containsKey(y) && (x != y || v > 1)) {
                return true;
            }
        }
        return false;
    }
}

/**
 * Your TwoSum object will be instantiated and called as such:
 * TwoSum obj = new TwoSum();
 * obj.add(number);
 * boolean param_2 = obj.find(value);
 */

小結

我們掌握了核心的思路,不同的場景只需要進行相關的調整就行。

相關文章