longest-consecutive-sequence

给定一个未排序的整数数组,找出最长的连续元素序列的长度。

例如,
给定[100,4,200,1,3,2]
最长的连续元素序列是[1,2,3,4]。
返回其长度:4。

您的算法应该在O(n)复杂度下运行。

首先将数组的数据用hash表进行存放。这样查找每一个元素的时间复杂度就是O(1)
每次从数组中取出一个元素,然后在从该元素左右相邻元素在hash表中搜索。并记录该元素最长的相邻数目,并且将这些元素从hash表里删除。(这样保证删除所有的元素只遍历一次,最后总的就是O(n))

	public int longestConsecutive(int[] num) {
	    Set<Integer> nums = new HashSet<>(num.length);
	    // 将数组中的元素添加到hash表中
	    for (int number : num)
	        nums.add(number);
	    int resLenMax = 0;
	    for (int i = 0; i < num.length && nums.size() > 0; i++) {
	        int number = num[i];
	        // 尝试删除当前元素,如果删除失败,就查找下一个元素
	        if (!nums.remove(number))
	            continue;
	        int len = 1;
	        int left = number - 1;
	        int right = number + 1;
	        // 尝试删除左相邻值,如果删除成功对应长度+1,并且继续尝试
	        while (nums.remove(left)) {
	            len = len + 1;
	            left = left - 1;
	        }
	        // 尝试删除右相邻值,如果删除成功对应长度+1,并且继续尝试
	        while (nums.remove(right)) {
	            len = len + 1;
	            right = right + 1;
	        }
	        // 判断当前搜索值的相邻长度是否大于目前最大长度,如果大于,则更新
	        if (len > resLenMax)
	            resLenMax = len;
	    }
	    return resLenMax;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值