170. Two Sum III - Data structure design
170. Two Sum III - Data structure design
在 2 Sum 裡面,有一個比較高效率的解法,就是使用 Hash Table 來解決問題,這題物件的題目就很簡單,不過有一個小地方要注意,那就是之前我們的 Hash Table 是記錄元素在陣列中的位置,但是這個物件讀取資料的方式是透過 Data Stream 的方式讀入,我們並沒有儲存位置,我們反而是記錄這個數字出現的次數。
可是這樣就會有一個問題要注意,例子是如果我先輸入一個 2
。接著,程式收到指令,再去找看看有沒有兩個數字的總和是 4
,這個情況底下,我要找的另外一個數字也是 2
,所以要判斷兩個情況:
- 如果 2 Sum 是兩個一樣的數字,要檢查是否該數字已經輸入過了兩次
- 如果不同,那就只要判斷另外一個數字是否存在就好
class TwoSum:
def __init__(self):
"""
Initialize your data structure here.
"""
self.table = defaultdict(int)
def add(self, number: int) -> None:
"""
Add the number to an internal data structure..
"""
self.table[number] += 1
def find(self, value: int) -> bool:
"""
Find if there exists any pair of numbers which sum is equal to the value.
"""
for key in self.table:
target = value - key
if target == key and self.table[key] >= 2:
return True
if target != key and target in self.table:
return True
return False
雙指針
這一題也可以用雙指針來寫,不過要注意的是,我們需要檢查陣列的排序狀態。
class TwoSum:
def __init__(self):
"""
Initialize your data structure here.
"""
self.arr = []
self.sorted = False
def add(self, number: int) -> None:
"""
Add the number to an internal data structure..
"""
self.arr.append(number)
self.sorted = False
def find(self, value: int) -> bool:
"""
Find if there exists any pair of numbers which sum is equal to the value.
"""
if self.sorted:
left = 0
right = len(self.arr) - 1
while left < right:
total = self.arr[left] + self.arr[right]
if total == value:
return True
elif total > value:
right -= 1
elif total < value:
left += 1
return False
else:
self.arr.sort()
self.sorted = True
return self.find(value)