提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
什么是哈希表:
直白来讲其实数组就是一张哈希表。哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:
一般哈希表都是用来快速判断一个元素是否出现集合里。
一、常见的三种哈希结构
- 数组
- set (集合):基于map实现的,是一个不允许有重复元素的集合。
- map(映射)
二、HashMap中基本操作
1.创建一个哈希表
HashMap<String,Integer> names=new HashMap<Integer,String>();
key value
2.基本操作
添加键值对:names.put(1,"penny");
若map中存在key 则返回key对应的value值:getOrDefault(Object key, Object defaultValues);
根据key值访问value:names.get(1);
根据key值删除元素:names.remove(1);
替换指定key对应的value:names.replace(key,value);
检查是否存在指定的key对应的映射关系:names.containsKey(key);
检查是否存在指定的value对应的映射关系:names.containsValue(value);
entrySet:
entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。用来遍历map的一种方法。
Set<Map.Entry<String, String>> entryseSet=map.entrySet();
for (Map.Entry<String, String> entry:entryseSet) {
System.out.println(entry.getKey()+","+entry.getValue());
}
即通过getKey()得到K,getValue()得到V。
三、HashSet中基本操作
1.创建一个哈希表
HashSet<Integer> names=new HashSet<Integer>();
2.基本操作
添加元素:names.add("google");
删除元素:names.remove("Taobao");
判断元素是否存在于集合中:names.contains("Taobao");
删除集合中所有的元素:names.clear();
将集合转换为数组:return names.stream().mapToInt(x -> x).toArray();
计算集合中元素的数量:names.size();
四、三数之和
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0
且不重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1] 输出:[] 解释:唯一可能的三元组和不为 0 。 解题思路: 使用双指针法,如图所示:
首先将数组排序,再慢慢移动指针,找到满足条件的三个数,边找边去重。 四数之和也是同理,只是再加一层for循环。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<>();
Arrays.sort(nums);
int len=nums.length;
for(int i=0;i<len-2;i++)
{
int right=len-1;
if(nums[i]>0)
return result;
if(i>0&&nums[i-1]==nums[i])
continue;
int left=i+1;
while(left<right)
{
if(nums[i]+nums[left]+nums[right]==0)
{
List<Integer> list=new ArrayList<>();
list.add(nums[i]);
list.add(nums[left]);
list.add(nums[right]);
result.add(list);
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
left++;
right--;
}
else if(nums[i]+nums[left]+nums[right]>0)
{
right--;
}
else{
left++;
}
}
}
return result;
}
}