📅  最后修改于: 2023-12-03 14:54:51.938000             🧑  作者: Mango
散列,又称哈希表,是一种数据结构,它可以快速地查找、插入或删除数据。散列的核心思想是利用一个函数把数据映射到一个固定范围的整数,这个整数就作为数组的下标,从而实现快速的访问。散列的查找、插入和删除操作的时间复杂度通常为 O(1)。
散列是一个非常实用的数据结构,下面是一些散列练习题,可以帮助程序员巩固散列的使用。
给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
示例:
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
思路: 通过遍历数组,将每个元素作为键,下标作为值存放到散列表中。对于每个要查找的元素,通过计算目标值减去当前元素得到差值,然后在散列表中查找该差值是否存在,如果存在,则返回它们的下标。
时间复杂度:O(n)。
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 n/2 的元素。
示例:
public int majorityElement(int[] nums) {
int count = 0;
Integer candidate = null;
for (int num : nums) {
if (count == 0) {
candidate = num;
}
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
思路:通过遍历数组,使用计数器统计出现次数,并记录当前出现次数最多的元素,最终返回这个元素即可。
时间复杂度:O(n)。
给定两个数组,编写一个函数来计算它们的交集。
示例:
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>();
List<Integer> result = new ArrayList<>();
// 统计nums1中元素的出现次数
for (int num : nums1) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
// 遍历nums2,如果元素在nums1中出现,则加入结果数组,并减少nums1中对应元素的出现次数
for (int num : nums2) {
if (map.containsKey(num) && map.get(num) > 0) {
result.add(num);
map.put(num, map.get(num) - 1);
}
}
// 将结果数组转换成整数数组
int[] resultArray = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
resultArray[i] = result.get(i);
}
return resultArray;
}
思路: 先遍历一个数组,将其中元素的出现次数存储到散列表中。然后再遍历另一个数组,对于其中的每个元素,如果在散列表中出现过,则加入结果数组并将散列表中该元素的出现次数减一。
时间复杂度: O(m+n),其中 m 和 n 分别为两个数组的长度。
散列表是一种非常实用的数据结构,可以用来解决很多常见的问题。掌握散列表的基本概念和常见的操作,对于程序员的职业发展是非常有帮助的。