线性表(散列)- 哈希表
感谢@pdai的全栈知识体系,数据结构与算法是相通的,做的题目与原博主不同。 https://www.pdai.tech/md/algorithm/alg-basic-array.html
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表
HashSet and HashMap
哈希表使用O(N)空间复杂度存储数据,并且以O(1)时间复杂度解决问题。
- Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如:只有小写字符的数据可以用一个长度为26的布尔数组来存储一个字符集合。
- Java中的HashMap主要用于映射关系,键不能重复,值可以重复。在对一个内容进行压缩或者其它转换时,利用 HashMap 可以把原始内容和转换后的内容联系起来。
相关题目
简单难度
697. 数组的度 https://leetcode.cn/problems/degree-of-an-array/
class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer, int[]> map = new HashMap<>();
int n = nums.length;
for (int i = 0; i < n; i++) {
if (map.containsKey(nums[i])) {
map.get(nums[i])[0]++;
map.get(nums[i])[2] = i;
} else {
map.put(nums[i], new int[]{1, i, i});
}
}
int maxNum = 0, minLen = 0;
for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
int[] arr = entry.getValue();
if (maxNum < arr[0]) {
maxNum = arr[0];
minLen = arr[2] - arr[1] + 1;
} else if (maxNum == arr[0]) {
if (minLen > arr[2] - arr[1] + 1) {
minLen = arr[2] - arr[1] + 1;
}
}
}
return minLen;
}
}
中等难度
128. 最长连续序列 https://leetcode.cn/problems/longest-consecutive-sequence/
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
int maxLen = 0;
for (int num : set) {
if (!set.contains(num - 1)) {
int curNum = num;
int curLen = 1;
while (set.contains(curNum + 1)) {
curNum += 1;
curLen += 1;
}
maxLen = Math.max(maxLen, curLen);
}
}
return maxLen;
}
}