【LeetCode】 Two Sum

来源:互联网 发布:淘宝蓝海选品软件 编辑:程序博客网 时间:2024/05/16 08:29

问题描述:

给定一个数组和一个目标值,在这个数组中找到两个数,使得这两个数的和为目标值。返回这两个数的下标。

解决方法:

  • 1、暴力破解法
    ……

  • 2、哈希表Hash Table

参考资料:

http://blog.csdn.net/u012903926/article/details/47293521

    HashMap map = new HashMap();/**         * 通过指定key获取对应的value         * 如果key值不存在,则返回null;         * 如果key存在但是value为null,则返回null;         * 如果key存在并且value不为null,则返回value的值;         * 恰当的使用时机:已知key值存在(并且value不为null)的情况下,想要通过key找到value的时候         */    map.get();        /**         * 恰当的使用时机:当要判断map中是否包含了键key的时候         * 如果包含key但是对应的value值为null,则返回ture         * 如果包含key并且对应的value值存在,则返回value         * 如果不包含key,则返回false         */    map.containsKey();        /**         * 以上同理         */    map.containsValue();

时间效率:
  在暴力破解方法中的时间复杂度之所以是O(n2),是因为该方法中有两层循环。第一层循环为O(n),第二层也为O(n)。如果使用Hash Table,以空间换时间,并且Hash函数选取合适,那么第二层的查找可以达到O(1),但是空间复杂度就会提高到O(n)。
  在java中,HashMap就是最好的选择。

多考虑一点:
面对这样一个输入[ 5 , 3 , 5 ],目标sum是 10 的情况。
因为map的key值不允许重复,所以map中的元素只有两个{5,2}和{3,1}。因为题目中“假设题目的解只有一种情况”。当sum[i]指向第一个5的时候,target=sum-sum[i]=5。通过map查找key=5的元素的下标是得到的map.get( target )为2。此时得到一个解:下标为0和2的元素满足目标和为10。此时立即返回。

0 0
原创粉丝点击