【LeetCode】Longest Consecutive Sequence

来源:互联网 发布:c语言架构 编辑:程序博客网 时间:2024/06/06 02:50
Longest Consecutive Sequence 
Total Accepted: 7382 Total Submissions: 27608 My Submissions
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.
解题思路
1、暴力搜素,对每个数都搜一遍,这个很明显,需要O(N*M),应该会超时,我没试过。
2、将当前数组放到set中,然后扫描数组,对每个数进行加减判断,如果扫描到了,就从set中remove掉,同时count++。这样一遍就可以扫描出结果。
这个思路我用了两种方法,不过第2种明显比第1种要耗时。

Java AC 1

public class Solution {    public HashSet<Integer> numSet;    public int longestConsecutive(int[] num) {        if(num == null || num.length == 0){            return 0;        }        int len = num.length;        int maxNum = num[0];        numSet = new HashSet<Integer>();        for(int i = 0; i < len; i++){            numSet.add(num[i]);        }        int maxLen = 1;        for(int i = 0; i < len; i++){            int tempLen = 1;        if(numSet.contains(num[i])){            tempLen += getCount(num[i] + 1, 1);            tempLen += getCount(num[i] - 1, 2);        }            if(tempLen > maxLen){                maxLen = tempLen;            }        }        return maxLen;    }    public int getCount(int curNum, int seq){        int count = 0;        while(numSet.contains(curNum)){            numSet.remove(curNum);            if(seq == 1){                curNum++;            }else{                curNum--;            }            count++;        }        return count;    }}
Java AC 2

public class Solution {    public int longestConsecutive(int[] num) {        if(num == null || num.length == 0){            return 0;        }        int len = num.length;        int maxNum = num[0];        int minNum = num[0];        HashSet<Integer> numSet = new HashSet<Integer>();        for(int i = 0; i < len; i++){            numSet.add(num[i]);            if(num[i] > maxNum){                maxNum = num[i];            }            if(num[i] < minNum){                minNum = num[i];            }        }        int maxLen = 1;        for(int i = 0; i < len; i++){        if (numSet.isEmpty()) {break;}            if(!numSet.contains(num[i])){                continue;            }            numSet.remove(num[i]);            int tempLen = 1;            for(int j = 1; j <= maxNum-num[i]; j++){                if(numSet.contains(num[i]+j)){                    numSet.remove(num[i]+j);                    tempLen++;                }else{                    break;                }            }            for(int j = 1; j <= Math.abs(num[i]-minNum); j++){                if(numSet.contains(num[i]-j)){                    numSet.remove(num[i]-j);                    tempLen++;                }else{                    break;                }            }            if(tempLen > maxLen){                maxLen = tempLen;            }        }        return maxLen;    }}

0 0
原创粉丝点击