目录
解题过程:
描述:
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
分析条件:
1.未排序,就是让你自己去排序
2.从示例可以看出
元素可以重复
那我们的解题思路:
排序并去重
难点:如何去重,如何找到连续子序列的最大值
去重:利用set集合(无序)
找到最大值:利用Hash表
解题思路:
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length == 0){
return 0;
}
//定义结果变量
int ans = 0;
//创建set集合
Set<Integer> st = new HashSet<>();
//将nums转为set集合
for(int num : nums){
st.add(num);
}
//遍历set集合,以每个序列的起点出发
for(int x : st){
//排除非起点数
if(st.contains(x - 1)){
continue;
}
//此数作为起点,寻找最长子序列
int y = x + 1;
//最终y = 终点数 + 1
while(st.contains(y)){
y++;
}
ans = Math.max(ans,y - x);
}
return ans;
}
}
通过这道题可以学到什么:
1.使用set来排除重复元素
2.set集合添加元素add,判断元素是否在set中,contains()方法
3.思想:找连续子序列,从头开始找,通过st.contains(x-1)判断它是不是头结点