您的位置:首页 > 其它

【LeetCode】 Two Sum

2016-10-02 20:55 316 查看

问题描述:

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

解决方法:

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。此时立即返回。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: