• [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
  • 相关阅读:
    [经典SQL语句]根据父级ID查找所有子级ID,并将所有ID用逗号隔开返回
    小程序页面之间传值
    微信小程序样式wxss各种问题总结(不断更新)
    产品经理--用户体验设计
    linux(centos)下为php添加添加GD扩展
    discuzx3.2发帖流程
    linux(centos)下配置nginx配置文件nginx.conf显示语法高亮
    Mysql关于字段的操作(记录)
    Mysql为表字段添加索引(记录)
    laravel-admin报错: Driver [] is not supported.
  • 原文地址:https://www.cnblogs.com/lz87/p/7198495.html
Copyright © 2020-2023  润新知