Longest Consecutive Sequence

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.

public class Solution {
    public int longestConsecutive(int[] num) {
        Set<Integer> set = new HashSet<Integer>();
        int LEN = 0;
        int len = 0;
        for(int i = 0; i < num.length ; i ++){//将元素添加到容器中,方便查找O(1)
            set.add(num[i]);
        }
        //从任意元素开始查找它的前后元素,存在len++,删除此元素,不存在,则退出
        for(int i = 0 ; i < num.length ; i ++){
            len = 1;
            if(set.contains(num[i])){//不存在说明已经访问过了
                int right = num[i] + 1;
                int left = num[i] - 1;
                while(set.contains(right)){
                   len++;
                   set.remove(right);
                   right++;
                }
                while(set.contains(left)){
                    len++;
                    set.remove(left);
                    left--;
                }
                if(len > LEN){
                    LEN = len;
                }
            }
        }
        return LEN;
    }
}

看到这道题的时候,第一反应是先排序,O(nlogn),然后就再查找

显然是不符合题意,题意要求是O(n),所以说排序是不可能符合题意的。只能使用空间换时间的方法

自己一开始想着要修改HashSet的hashCode函数,使得添加到set中就已经是排好序的了,这样就可以实现在O(n)时间内排好序,如此也就节省了时间,后来证明自己想多了,甚至还考虑连续序列的异或和 与非连续序列的异或和的差异(事实是不可区分的),自己过于把事情复杂化了

HashSet的功能是提供存储和查找的功能(不适合访问节点的索引),而在查找方面,HashSet是非常高效的。因此利用它的高效查找性,也就实现了上述算法的简洁性。

所以说,当牵涉到在连续的问题,可以考虑set的高效查找特性!

Runtime: 253 ms


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值