Longest Consecutive Sequence

来源:互联网 发布:java获取浏览器语言 编辑:程序博客网 时间:2024/06/01 10:44

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


0 0
原创粉丝点击