zoukankan      html  css  js  c++  java
  • [LintCode] Two Sum

    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
  • 相关阅读:
    正则表达式 常见的简写形式
    Git 常用命令
    利用npm安装删除模块
    发送验证码设置settime(验证码倒计时)
    30分钟后过期(订单过期)
    JS 获取当前日期时间以及其他操作
    判断终端
    一个轻量、可拓展、针对手机网页的前端开发者调试面板vConsole
    数据结构与算法----树(中)
    数据结构与算法----树(上)
  • 原文地址:https://www.cnblogs.com/lz87/p/7198495.html
Copyright © 2011-2022 走看看