Leetcode: Two Sum III - 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.

For example,
add(1); add(3); add(5);
find(4) -> true
find(7) -> false

The trade off should be considered: In fact, there has to be one operation's time complexity is O(n) and the other is O(1), no matter add or find. So clearly there's trade off when solve this problem, prefer quick find or quick add.

if there are more find, add can be pre-done

 1 public class TwoSum {
 2         Set<Integer> sum;
 3         Set<Integer> num;
 4         
 5         TwoSum(){
 6             sum = new HashSet<Integer>();
 7             num = new HashSet<Integer>();
 8         }
 9         // Add the number to an internal data structure.
10         public void add(int number) {
11             if(num.contains(number)){
12                 sum.add(number * 2);
13             }else{
14                 Iterator<Integer> iter = num.iterator();
15                 while(iter.hasNext()){
16                     sum.add(iter.next() + number);
17                 }
18                 num.add(number);
19             }
20         }
21     
22         // Find if there exists any pair of numbers which sum is equal to the value.
23         public boolean find(int value) {
24             return sum.contains(value);
25         }
26     }

 

 more add:

 1 public class TwoSum {
 2     HashMap<Integer, Integer> map;
 3     public TwoSum() {
 4         map = new HashMap<Integer, Integer>();
 5     }
 6     
 7     public void add(int x) {
 8         if (map.containsKey(x)) {
 9             map.put(x, map.get(x)+1);
10         }
11         else {
12             map.put(x, 1);
13         }
14     }
15     
16     public boolean find(int target) {
17         for (int i : map.keySet()) {
18             if (map.containsKey(target-i)) {
19                 if (target - i != i) return true;
20                 else if (map.get(i) >= 2) return true;
21             }
22         }
23         return false;
24     }
25 }

注意17行的map.KeySet() return是一個Set形式的key的集合,Set是Collection的Subinterface, 所以這種for循環方法對Set也適用。而且即使key理論上是Integer, for循環前面的元素還是可以寫成int:for(int i : map.keySet())


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM