【LeetCode】Longest Consecutive Sequence

Longest Consecutive Sequence 
Total Accepted: 4076 Total Submissions: 15654 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.
求数组中最长的连续序列的长度。
要求O(n)时间内解决。
思路是这样的,循环一次数组num,将数字放在set中,同时求出最大最小值。
下一步循环数组,如果set不为空并且包含num[i],进入内部数字统计。
针对每个数字,进入循环之后,就从set中remove掉,这样做主要是为了重复搜索。
然后再对num[i]++,一直到maxNum,只要其中有一个数字在set中不存在,立马break。
对num[i]--,一直到minNum,只要其中有一个数字在set中不存在,立马break。
否则就tempLen++;
针对数组[100, 4, 200, 1, 3, 2],
我们做一次循环,将这些数字都存在set中,同时求出maxNum = 200,minNum = 1;
再次循环数组num,从100开始,发现99和101都不在set中,tempLen就是1。
这一步做完之后,将100从set中remove掉。
第二个数,4,一直加,从4到200,发现5不在set中,不需要循环了,退出。
一直减,到1,发现3,2,1都在set中,那么tempLen = 4。
tempLen > maxLen ,那么maxLen就是4。
这一步完成之后,set中就剩200了。
我们再回到主循环,下一个数,是200,还在set中,201和199都不在set中,长度是1,不需要更新最大长度。
到下一个数,1,不在set中,就不需要再统计了。
如果不剪枝的话,会重复搜索,从1开始搜索,会浪费很多时间。
Java AC

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;
    }
}

你可能感兴趣的:(【LeetCode】Longest Consecutive Sequence)