Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。
Java 中的 HashMap 主要用于映射关系,从而把两个元素联系起来。HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。在对一个内容进行压缩或者其它转换时,利用 HashMap 可以把原始内容和转换后的内容联系起来。
1. 数组中两个数的和为给定值
1. Two Sum (Easy)
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer>map=new HashMap<>();
int[] result=new int[2];
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
result[0]=map.get(target-nums[i]);
result[1]=i;
break;
}
map.put(nums[i],i);
}
return result;
}
}
2. 判断数组是否含有重复元素
217. Contains Duplicate (Easy)
class Solution {
public boolean containsDuplicate(int[] nums) {
HashSet<Integer> set=new HashSet<>();
for(int num:nums){
if(set.contains(num))return true;
else set.add(num);
}
return false;
}
}
3. 最长和谐序列
594. Longest Harmonious Subsequence (Easy)
class Solution {
public int findLHS(int[] nums) {
HashMap<Integer,Integer>map=new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
int result=0;
for(int num: map.keySet()){
if(map.containsKey(num+1)){
result=Math.max(result,map.get(num+1)+map.get(num));
}
}
return result;
}
}
4. 最长连续序列
128. Longest Consecutive Sequence (Hard)
class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer>set=new HashSet<>();
for(int num:nums){
set.add(num);
}
int result=0;
for(int i=0;i<nums.length;i++){
if(!set.contains(nums[i]-1)){
int length=1;
int num=nums[i];
while(set.contains(num+1)){
length+=1;
num+=1;
}
result=Math.max(length,result);
}
}
return result;
}
}