[LintCode] Two Sum - 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
add(1); add(3); add(5);
find(4) // return true
find(7) // return false


For two sum, typically we have two solutions to select from: using hash table or sorting then
using two pointers technique.
Using hash table gives us a O(n) runtime and O(n) space algorithm;
Using sorting/two pointers technique gives us a O(n*logn) time, and O(1) space(if quick sort is used) algorithm.

This problem is different with the Two Sum problem in the following two aspects.
1. We need to design a data structure that supports adding new element to the internal
data structure that stores all elements.
2. We only check if such a pair exists or not; no need to return the indices as is
required in the Two Sum problem.

Since we need to maintain such an internal data structure that stores all elements and
an add element operation, we need to use O(n) space for this regardless which approach
we use. So this makes the hash table solution better as it has a better runtime of O(n).

Solution. O(n) time, O(n) space, Hash table
Since we only check if such a pair exists, a hash set and one pass is sufficient.
Another implementation is to iterate through the list and store all key-value pairs(value - nums[i], nums[i])
in a hash map. Then during the second pass, for each element nums[i], check if a key of
value - nums[i] exists. This still gives us O(n) runtime but obviously not as good
as the one pass solution. However, this two passes solution is useful when we need
to return indices as is required in Two Sum.

 1 public class TwoSum {
 2     private ArrayList<Integer> numbers;
 3     
 4     public TwoSum()
 5     {
 6         this.numbers = new ArrayList<Integer>();
 7     }
 8     
 9     // Add the number to an internal data structure.
10     public void add(int number) {
11         this.numbers.add(number);
12     }
13 
14     // Find if there exists any pair of numbers which sum is equal to the value.
15     public boolean find(int value) {
16         HashSet<Integer> set = new HashSet<Integer>();
17         for(int i = 0; i < this.numbers.size(); i++)
18         {
19             if(set.contains(numbers.get(i)))
20             {
21                 return true;
22             }
23             set.add(value - numbers.get(i));
24         }
25         return false;
26     }
27 }
28 // Your TwoSum object will be instantiated and called as such:
29 // TwoSum twoSum = new TwoSum();
30 // twoSum.add(number);
31 // twoSum.find(value);


Related Problems
Two Sum - Input array is sorted
Word Abbreviation Set
Two Sum - Difference equals to target
Two Sum - Less than or equal to target
Two Sum - Unique pairs
Two Sum - Closest to target
Two Sum - Greater than target
Two Sum

转载于:https://www.cnblogs.com/lz87/p/7198495.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值