java算法day29
- 128 最长连续序列
128 最长连续序列
这个题审好题是关键。
这个题问的最长连续序列指的是数字依次递增的序列的最长长度。
比如例子[100,4,200,1,3,2]
那么就是1,2,3,4。长度为4
[0,3,7,2,5,8,4,6,0,1]
那么就是0,1,2,3,4,5,6,7,8长度为9
接下来来看做法:
这个题最好想的应该是哈希。最直观的想法应该就是为了统计每个连续序列的长度,那么我们希望定位到每个连续序列的起点。然后从起点开始遍历每个序列,从而获取长度,更新最长长度。
问题关键:什么样的数才是一个连续序列的起点?
回答是这个数的前一个数不存在于数组中。因此我们需要能够快速判断当前num的前num-1是否存在于数组中。那么快速判断我们就可以用哈希来优化。如果num-1还在数组中,那说明这个num肯定不是序列的起点,如果不在数组中,那么就能肯定,是序列的起点。至于为什么,自己想想就清楚了。
那么定位到了起点之后,就要从起点开始遍历整个序列,直到当前数的num+1并不存在于数组中时,可以判断遍历终止,因此还需要能够快速判断num后面的num+1是否存在于数组中。
可以看到这个过程涉及了很多快速查找的使用,因此哈希表用来存储数组中的所有数已经非常明确了。
class Solution {
public int longestConsecutive(int[] nums) {
int res = 0; // 记录最长连续序列的长度
Set<Integer> numSet = new HashSet<>(); // 记录所有的数值
for(int num: nums){
numSet.add(num); // 将数组中的值加入哈希表中
}
int seqLen = 0; // 连续序列的长度
for(int num: numSet){
// 如果当前的数是一个连续序列的起点,统计这个连续序列的长度
if(!numSet.contains(num - 1)){
seqLen = 1;
while(numSet.contains(++num))seqLen++; // 不断查找连续序列,直到num的下一个数不存在于数组中
res = Math.max(res, seqLen); // 更新最长连续序列长度
}
}
return res;
}
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » java算法day29
发表评论 取消回复