• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

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())

posted @ 2015-01-27 12:51  neverlandly  阅读(3527)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3