描述:
保持数组中的每个元素与其索引相互对应的最好方法——哈希表。
一个简单的实现使用了两次迭代。
在第一次迭代中,将每个元素的值和它的索引添加到表中。
在第二次迭代中,将检查每个元素所对应的目标元素(target−nums[i])是否存在于表中。
注意,该目标元素不能是 nums[i]本身!
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
哈希表:(支持快速插入和快速搜索)
哈希(哈希函数、散列函数):
将任意长度的消息压缩到某一固定长度的消息摘要的函数;
java1.8,HashMap内部结构:
哈希冲突:
假设hash表的大小为9(即有9个槽),现在要把一串数据存到表里:5,28,19,15,20,33,12,17,10
简单计算一下:hash(5)=5, 所以数据5应该放在hash表的第5个槽里;hash(28)=1,所以数据28应该放在hash表的第1个槽里;hash(19)=1,也就是说,数据19也应该放在hash表的第1个槽里——于是就造成了碰撞(也称为冲突,collision)。
链地址法:
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
如图:哈希函数将键映射到特定的桶,其中 1987和2都映射到2号桶,产生冲突