• 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.

    [解题思路]

    数组,O(n)---->使用hash,空间换时间

    对于当前数N,我们检查N-1, N-2, N-3....N-K是否在hashmap中

    对于当前数N,我们检查N+1, N+2, N+3....N+j是否在hashmap中

    这里使用visited数组来记录已经访问过的数,这样减少检查次数,时间复杂度O(n)

    [Thoughts]
    Since it requires O(n) solution, normal sort won't be work here. Hash probably is the best choice.
    3 Steps:
    1. create the hashmap to hold <num, index>
    2. scan the num vector from left to right, for each num
                   i, check whether num -1 is in the map  (loop)
                  ii, check whether num+1 is in the map  (loop)
    3. track the sequence length during scanning.

    public class Solution {
        public int longestConsecutive(int[] num) {
            int len = num.length;
            Map<Integer, Integer> map = new HashMap<Integer,Integer>();
            
            for(int i = 0; i< len; i++){
                map.put(num[i],i);
            }
            
            int result = 0, count;
            int[] visited = new int[len];
            
            //这里使用visited数组来记录已经访问过的数,这样减少检查次数,时间复杂度O(n)
            for(int i = 0; i< len; i++){
                count =1 ;
                if(visited[i] == 1){
                    continue;
                }
                
                int index = num[i];
                visited[i] = 1;
                
                //注意 --index 先递减
                while(map.containsKey(--index)){
                    count++;
                    visited[map.get(index)] = 1;
                }
                // index 归位
                index = num[i];
                
                //注意 ++index 先递增
                while(map.containsKey(++index)){
                    count++;
                    visited[map.get(index)] = 1;
                }
                
                // result 记录之前的最大长度,与每次循环得到的长度相比,取最大
                if(count > result) result = count;
                
            }
            
            return result;
        }
    }

    ref: http://www.cnblogs.com/feiling/p/3265197.html

    http://fisherlei.blogspot.com/2013/02/leetcode-longest-consecutive-sequence.html

  • 相关阅读:
    [考试反思]0904NOIP模拟测试37:守望
    游戏:最短路,拆点
    [考试反思]0903NOIP模拟测试36:复始
    [考试反思]0902NOIP模拟测试35:摆动
    长寿花:dp
    [考试反思]0901NOIP模拟测试34:游离
    赤壁情:dp
    [考试反思]0829NOIP模拟测试33:仰望
    [考试反思]0828NOIP模拟测试32:沉底
    宅男计划:单峰函数三分
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3537449.html
Copyright © 2020-2023  润新知