问题描述:
给定一个数组和一个目标值,在这个数组中找到两个数,使得这两个数的和为目标值。返回这两个数的下标。
解决方法:
1、暴力破解法
……2、哈希表Hash Table
参考资料:
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。此时立即返回。