# 170. Two Sum III - Data structure design

![](https://4272748102-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LekNH5IywF8mjBxFcnu%2F-MkXSSFw0TkfUzfdyJwh%2F-MkXeGrU69ooC06kYN75%2Fimage.png?alt=media\&token=9d24e731-adeb-4710-95eb-d5cbb429bc05)

![](https://4272748102-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LekNH5IywF8mjBxFcnu%2F-MkXSSFw0TkfUzfdyJwh%2F-MkXeJz7_zWFtSReGKFU%2Fimage.png?alt=media\&token=dddfb2bd-1fb1-459e-b0b7-3fd7d9c8c561)

time: find - O(n), add: O(1)

space: O(n)

```java
class TwoSum {
    private Map<Integer, Integer> map;
    public TwoSum() {
        map = new HashMap<>();
    }
    
    public void add(int number) {
        map.put(number, map.getOrDefault(number, 0) + 1);
    }
    
    public boolean find(int value) {
        for (Integer num1 : map.keySet()) {
            int num2 = value - num1;
            
            int num2Count = (num1 == num2) ? 2 : 1;
            if (map.getOrDefault(num2, 0) >= num2Count) {
                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);
 */
```
