Leetcode 128. Longest Consecutive Sequence 最长连续序列 解题报告

1 解题思想

题目会给出一个数组,数组里面包含了一些数字,现在需要用O(n)的时间找出这些数字里面,能够成连续区间的最长长度是多少。

这道题比较难的地方在于,要求在常数时间解题。

解题思想呢也是用HashMap,HashMap保存某个数(在作为边界的情况下)及其对应的最长连续长度:
1、假设我们新过来一个数,我们首先保证他没有被处理过,这个后面的步骤需要保证,即每个数只处理一次。
2、对于没处理过的数,我们在HashMap中寻找其左边,其右边是否存在,存在的话返回其长度,不存在则置0
3、当前数的位置的长度,就是步骤2中找到的两个长度的和,加一
4、同时需要找到当前位置,最左边的边界和最右边的边界,根据步骤2的长度就可以,然后也更新为3中计算得到的当前长度的位置。
5、至于最左边最右边和当前位置之外的,是不是感觉中间的那些长度没有被更新?恩其实,如果不作为边界,那么他们是不会再被访问到的(1中保证了),所以这下就懂了吧

2 原题

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

3 AC解

public class Solution {
    /**
     * */
    public int longestConsecutive(int[] nums) {
        int res = 0;
        HashMap<Integer,Integer> counter = new HashMap<Integer,Integer>();
        for(int num:nums){
            if(counter.containsKey(num)) continue;
            int leftCount = counter.getOrDefault(num-1,0);
            int rightCount = counter.getOrDefault(num+1,0);
            int sum = leftCount + rightCount + 1;
            counter.put(num,sum);
            counter.put(num-leftCount,sum);
            counter.put(num+rightCount,sum);
            res = Math.max(res,sum);
        }
        return res;

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值