LeetCode -- 128. 最长连续序列 java

本文详细解析了一种求解最长连续序列的算法。通过使用HashSet数据结构存储数组中的所有数字,算法能有效地避免重复计算,提高效率。遍历数组过程中,若数字存在于集合中,则计算其前后连续的数字序列长度,更新最长连续序列结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
思路:
首先使用一个集合HashSet存入所有的数字。然后遍历数组中的每个数字,如果其在集合中存在,那么将其移除,然后分别用两个变量pre和next算出其前一个数跟后一个数,然后在集合中循环查找(集合中不用写循环语句),如果pre在集合中,那么将pre移除集合然后pre再自减1直至pre不在集合之中,对next采用同样的方法,那么next-pre-1就是当前数字的最长连续序列,更新res即可。
这里再说下,为啥当检测某数字在集合中存在当时候,都要移除数字。这是为了避免大量的重复计算,就拿题目中的例子来说吧,我们在遍历到4的时候,会向下遍历3,2,1,如果都不移除数字的话,遍历到1的时候,还会遍历2,3,4。同样,遍历到3的时候,向上遍历4,向下遍历2,1,等等等。如果数组中有大量的连续数字的话,那么就有大量的重复计算,十分的不高效,所以我们要从HashSet中移除数字.

public int longestConsecutive (int[] num){
	// 先遍历数组,将数字放入集合
	Set<Integer> set = new HashSet<>();
	for (int n:num) {
		set.add(n);
	}
	
	// 遍历数组中的每个数字,如果在集合中存在,那么将其移除,然后
	// 分别用pre, next算出前一个数和后一个数,并在集合中查找
	int res = 0;
	for (int n:num) {
		if (set.remove(n)) {
			int pre = n-1, next = n+1;
			// 如果pre在集合中,那么将pre移除,pre自减1,直到pre不在集合中
			while(set.remove(pre)) {
				pre --;
			}
			while (set.remove(next)) {
				next ++;
			}
			// next-pre-1就是当前数字的最长连续序列, 更新res即可
			res = Math.max(res, next - pre + 1);
		}
	}
	return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值