陣列系列
力扣資料結構之陣列-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 的解法,這裡把這一題單獨拿出來只是為了學習的系統性。
所以不做過多的展開。
區別
這一題還有一個核心的區別是資料會一直變化,所以陣列的排序會打折扣。
當然也可以調整為對應的插入排序等演算法。
常見演算法
- 暴力
2)藉助 Hash
- 排序+二分
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);
*/
小結
我們掌握了核心的思路,不同的場景只需要進行相關的調整就行。