ps:本文章仅用来记录日常学习的所思所想,各位看到可取之处也可纳为己用,说的不对的地方还请多多指教。
1.题目描述
128.最长连续序列(中等)
给定一个未排序的整数数组
nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为
O(n)
的算法解决此问题。示例 1:
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是[1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
2.题目分析
题目很好理解,也就是算出最长连续元素的个数,但有个关键是,观察序列我们可知这连续序列是不能重复的。去重我们一般就要想到HashSet,这家伙的不允许重复特性让我们去重变得简单许多。
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> nums_set = new HashSet<Integer>();
for (int num : nums){
nums_set.add(num);
}
int longestStreak = 0;
for(int num : nums_set){
if(!nums_set.contains(num - 1)){
int currentNum = num;
int currentStreak = 1;
while(nums_set.contains(currentNum+1)){
currentNum +=1;
currentStreak +=1;
}
longestStreak = Math.max(longestStreak,currentStreak);
}
}
return longestStreak;
}
}
首先我们创建一个HashSet,这没什么好说的,值得一说的是后面HashSet<Integer>里面的Integer是可以省略的
Set<Integer> nums_set = new HashSet<Integer>();
然后我们用增强型for循环来添加元素到HasSet中去重;
for (int num : nums){
nums_set.add(num);
}
再然后我们声明一个变量longestStreak来最后输出最大连续序列数, 遍历HashSet里的元素,当遍历到的num没有前驱的时候,它就是我们要找的连续序列的开端,我们将其赋值给记录变量currentNum,为了增加可读性,我们还可以增加一个记录当前最大连续数的变量currentStreak。
int longestStreak = 0;
for(int num : nums_set){
if(!nums_set.contains(num - 1)){
int currentNum = num;
int currentStreak = 1;
while(nums_set.contains(currentNum+1)){
currentNum +=1;
currentStreak +=1;
}
longestStreak = Math.max(longestStreak,currentStreak);
}
}
每当HashSet里有currentNum的后继 ,currentNum加一,currentstreak加一。当HashSet中没有后继的时候,就会跳出循环,然后我们将其赋值给longestStreak,然后return就完事了。至于为什么循环里不直接加longestStreak,我只能说我这样子写更加好读,不过那样也是可行的。
3.总结
HashSet和HashMap都是Java中的集合类,它们之间有几个关键的区别:
数据结构:
- HashSet是基于哈希表实现的集合,它使用哈希函数来存储元素,不允许有重复的元素。
- HashMap也是基于哈希表实现的键值对映射,它使用键值对来存储数据,其中键是唯一的,值可以重复。
存储内容:
- HashSet存储的是单个对象的集合,不需要键值对。
- HashMap存储的是键值对的映射关系,每个键值对都包含一个键和一个值。
用途:
- HashSet通常用于存储和检索集合中是否存在某个对象,它提供了高效的查找操作。
- HashMap用于存储键值对的映射关系,可以根据键来获取对应的值,是键值对的快速查找容器。
迭代顺序:
- HashSet中元素的迭代顺序并不是特定的,通常是无序的。
- HashMap中键值对的迭代顺序也不是特定的,通常也是无序的。如果需要有序的遍历,可以使用LinkedHashMap。
容错性:
- HashSet在存储元素时,会检查元素的hashCode值以及equals方法来避免存储重复元素。
- HashMap在存储键值对时,会根据键的hashCode值来确定存储位置,同时会处理哈希冲突,确保键的唯一性。
总的来说,HashSet用于存储独立的对象集合,而HashMap用于存储键值对的映射关系。它们分别适用于不同的场景和需求。