Longest Consecutive Sequence

来源:互联网 发布:涂鸦移动 王晔 知乎 编辑:程序博客网 时间:2024/06/09 17:47

题目要求提供O(n)时间复杂度的解法,因此可以可以排除使用普通的排序来解决此题。 在leetcode的论坛里看到了两个比较主流的方法。


一是使用hash map,第一轮遍历把所有元素以(int k , 0)加入hash map,key 是元素,value是0。第二轮遍历,从第一个元素开始,分别往前和往后查找连续元素的边界,遇到连续元素后,在counter中加一,随后把该元素相对应的value改写成1。因此遍历时就会跳过已经出现在其他连续序列之中的数,总体的时间复杂度为O(n)。


二是用普通map,第一轮遍历将map(num[i])set为1,因此在O(n)时间之内完成了排序,接下来按照这个map数出连续序列的边界。这个方法相对来说空间消耗会比第一种方法大,虽然量级相同。


我使用了第一种方法,不过使用的是hash set,当元素出现在连续序列中时,从set中删除该元素,使用的是第一种方法,但是在操作中会简化一点点,时间和空间上没有改进。

public class Solution {    public int longestConsecutive(int[] num) {        int maxLen = 0;        if (num == null || num.length == 0) {            return maxLen;        }        HashSet<Integer> set = new HashSet<Integer>();        for (int i = 0; i < num.length; i++) {            set.add(num[i]);        }        for (int i = 0; i < num.length; i++) {            int k = num[i];            int len = 1;            if (set.contains(k)) {                while (set.contains(k - 1)) {                    len++;                    set.remove(k - 1);                    k = k - 1;                }                k = num[i];                while (set.contains(k + 1)) {                    len++;                    set.remove(k + 1);                    k = k + 1;                }                maxLen = Math.max(len, maxLen);            }        }        return maxLen;    }}


0 0