算法題丨Longest Consecutive Sequence

描述

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
Your algorithm should run in O(n) complexity.git

示例

Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

算法分析

難度:高
分析:給定未排序的整型數組,找到數值連續的元素,並返回連續元素的最大長度。
思路:首先考慮通常的思路,能夠將數組先排序,而後遍歷數組元素,判斷是否連續,返回最大連續元素的個數,這樣的話,循環的複雜度爲O (n),排序的複雜度爲O (nlgn),算法的總體複雜度爲O (nlgn),並不知足題目要求的複雜度。因此,該算法題目的難點是如何採用O (n)的算法。
再考慮使用哈希表來存儲元素,由於哈希表提供了O (1)複雜度的Contains方法,以便咱們快速的訪問元素:
 1. 首先,咱們將數組元素構形成哈希表,並定義變量longestStreak=0,用來記錄最大連續元素的個數;
 2. 遍歷哈希表,判斷當前元素num-1,是否存在在哈希表中:
  a). 若是不存在,不用處理,繼續遍歷哈希表下一個元素;
  b). 若是存在,說明有比當前元素小1的值,則定義currentNum=當前元素,定義currentStreak=1,表示currentNum做爲開始比較的元素,剛開始的連續元素個數爲1;
  c). 開始後續比較,若是哈希表存在currentNum+1的元素,表示當前元素currentNum有後續相鄰的元素,連續的元素爲以前最大連續元素次數+1,開始下個一個元素比較,即currentNum+1;
  d). 後續比較結束後,將本次循環得到的currentStreak做爲本次循環記錄的最大連續元素個數,記錄本次最大連續次數currentStreak和以前最大連續次數longestStreak的最大值到longestStreak,並進入下一個循環遍歷;
 3. 循環遍歷結束後,返回最大連續次數longestStreak;github

代碼示例(C#)

public int LongestConsecutive(int[] nums)
{
    var numSet = new HashSet<int>(nums);
    //記錄最大連續元素個數
    int longestStreak = 0;

    foreach (int num in numSet)
    {
        //存在跟當前元素連續的值
        if (!numSet.Contains(num - 1))
        {
            int currentNum = num;
            int currentStreak = 1;

            //每匹配到後面連續的元素,當前最大連續元素個數+1
            while (numSet.Contains(currentNum + 1))
            {
                currentNum += 1;
                currentStreak += 1;
            }

            //最大連續元素個數取當前最大連續元素和記錄的最大連續元素個數二者最大者
            longestStreak = Math.Max(longestStreak, currentStreak);
        }
    }

    return longestStreak;
}

複雜度

  • 時間複雜度O (n).
  • 空間複雜度O (n).

附錄

相關文章
相關標籤/搜索