两数之和
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
示例
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
方法:
使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。
这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();//创建哈希表
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i); //如果不存在,就将键值对存入哈希表
}
return new int[0];
}
}
JAVA中的哈希表
哈希表主要是一个Dictionary具体的实现,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引
JAVA哈希表的构造方法
默认构造方法:Hashtable()
构造函数创建指定大小的哈希表:Hashtable(int size)
构造方法创建了一个以M中元素为初始化元素的哈希表。哈希表的容量被设置为M的两倍:Hashtable(Map m)
JAVA哈希表定义的方法
1、void clear( ),将此哈希表清空,使其不包含任何键。
2、Object clone( ),创建此哈希表的浅表副本。
3、boolean contains(Object value),测试此映射表中是否存在与指定值关联的键。
4、boolean containsKey(Object key),测试指定对象是否为此哈希表中的键。
5、boolean containsValue(Object value),如果此 Hashtable 将一个或多个键映射到此值,则返回 true。
6、Enumeration elements( ),返回此哈希表中的值的枚举。
7、Object get(Object key),返回指定键所映射到的值,如果此映射不包含此键的映射,则返回 null. 更确切地讲,如果此映射包含满足 (key.equals(k)) 的从键 k 到值 v 的映射,则此方法返回 v;否则,返回 null。
8、boolean isEmpty( ),测试此哈希表是否没有键映射到值。
9、Enumeration keys( ),返回此哈希表中的键的枚举。
10、Object put(Object key, Object value),将指定 key 映射到此哈希表中的指定 value。
11、void rehash( ),增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素。
12、Object remove(Object key),从哈希表中移除该键及其相应的值。
13、int size( ),返回此哈希表中的键的数量。
14、String toString( ),返回此 Hashtable 对象的字符串表示形式,其形式为 ASCII 字符 ", " (逗号加空格)分隔开的、括在括号中的一组条目。