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
  • 相关阅读:
    HTTP/2之服务器推送(Server Push)最佳实践
    QQ空间掉帧率优化实战
    “战术竞技类”外挂打击已开始!揭秘腾讯We Test游戏安全服务新动作!
    你知道android的MessageQueue.IdleHandler吗?
    Hi,腾讯WeTest联合Unity官方打造的性能分析工具UPA,今日全新发布!
    一次触摸,Android到底干了啥
    面向亿万级用户的QQ一般做什么?——兴趣部落的Web同构直出分享
    双十一临近,怎样让买家流畅地秒杀? ——腾讯WeTest独家开放电商产品压测服务
    mybatis-generator 覆盖新增XML
    Jvm 虚拟机
  • 原文地址:https://www.cnblogs.com/lz87/p/7198495.html
Copyright © 2011-2022 走看看