• LeetCode Two Sum III


    原题链接在这里:https://leetcode.com/problems/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

    题解:

    Two Sum类似.

    设计题目考虑trade off. 如果add 很多, find很少可以采用map方法.

    简历HashMap保存key 和 key的frequency. find value时把HashMap的每一个key当成num1, 来查找HashMap是否有另一个value-num1的key.

    num1 = value - num1时,检查num1的frequency是否大于1.

    Time Complexity: add O(1). find O(n). Space: O(n).

    AC Java:

     1 class TwoSum {
     2     
     3     HashMap<Integer, Integer> hm;
     4     
     5     /** Initialize your data structure here. */
     6     public TwoSum() {
     7         hm = new HashMap<Integer, Integer>();
     8     }
     9     
    10     /** Add the number to an internal data structure.. */
    11     public void add(int number) {
    12         hm.put(number, hm.getOrDefault(number, 0) + 1);
    13     }
    14     
    15     /** Find if there exists any pair of numbers which sum is equal to the value. */
    16     public boolean find(int value) {
    17         for(Map.Entry<Integer, Integer> entry : hm.entrySet()){
    18             int num1 = entry.getKey();
    19             int num2 = value-num1;
    20             if(hm.containsKey(num2) && (hm.get(num2)>1 || num1!=num2)){
    21                 return true;
    22             }
    23         }
    24         return false;
    25     }
    26 }
    27 
    28 /**
    29  * Your TwoSum object will be instantiated and called as such:
    30  * TwoSum obj = new TwoSum();
    31  * obj.add(number);
    32  * boolean param_2 = obj.find(value);
    33  */

    考虑到trade off, 上面用HashMap时add用O(1), find用O(n).

    用两个Set分别存现有nums 和现有sums可以treade off.

    这种设计适合少量add, 多量find操作.

    Time Complexity: add O(n). find O(1). Space: O(n).

    AC Java:

     1 public class TwoSum {
     2     HashSet<Integer> nums;
     3     HashSet<Integer> sums;
     4 
     5     /** Initialize your data structure here. */
     6     public TwoSum() {
     7         nums = new HashSet<Integer>();
     8         sums = new HashSet<Integer>();
     9     }
    10     
    11     /** Add the number to an internal data structure.. */
    12     public void add(int number) {
    13         Iterator<Integer> it = nums.iterator();
    14         while(it.hasNext()){
    15             sums.add(it.next()+number);
    16         }
    17         nums.add(number);
    18     }
    19     
    20     /** Find if there exists any pair of numbers which sum is equal to the value. */
    21     public boolean find(int value) {
    22         return sums.contains(value);
    23     }
    24 }
    25 
    26 /**
    27  * Your TwoSum object will be instantiated and called as such:
    28  * TwoSum obj = new TwoSum();
    29  * obj.add(number);
    30  * boolean param_2 = obj.find(value);
    31  */
  • 相关阅读:
    FTP服务总结
    编译安装hpptd2.4
    搭建DNS服务
    定制简单的Linux系统
    建立私有CA
    关于/boot文件的修复实验
    shell脚本进阶(二)
    datetime模块日期转换和列表sorted排序
    linux操作命令
    Python 中的特殊双下划线方法
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/5324746.html
Copyright © 2020-2023  润新知