LeetCode [中等]128. 最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

128. 最长连续序列 - 力扣(LeetCode)

思路:

利用哈希表查找效率O(1)。哈希表中保存不重复的数字作为键,值为null,之后遍历键,如果有连续小于该键的,那么向后遍历到最小的那个键,之后保存长度。

结果为所有连续序列长度最大值。

示例:

筛选起始数字:
对于 [4,3,1,2],其实只需要以1作为起始数字查一次就行,2、3、4均不需要再作为起始数字进行查询判断,因为4之前有3,查3肯定会查到4,同理,3之前有2,2之前有1,所以作为起始数字的条件是不存在 【该数字减一的数字】;
通过哈希表查找起始数字:
如果通过数组查找起始数字,对于 [4,3,3,3] 的包括重复元素的数组,筛选起始数字后,4不考虑,可是数组的3重复了3次,就会查询3次,但3这个元素其实只需要查询一次即可,所以需要去重,那么就可以利用哈希表的键值唯一特点,数组[4,3,3,3]建立的哈希表键值只有[4,3],筛选掉4之后,只剩下元素3,不会被元素重复浪费时间;

复杂度:
时间复杂度:O(n)
空间复杂度:O(n)

public class Solution {
    public int LongestConsecutive(int[] nums) {
        int len = nums.Length;
        if(len == 0)
            return 0;
        Hashtable ht = new Hashtable();
        for(int i = 0; i < nums.Length; i++)
        {
            if(!ht.ContainsKey(nums[i]))
            {
                ht.Add(nums[i],null);
            }
        }

        int resLength = 0;
        foreach(int num in ht.Keys)
        {
            if(ht.ContainsKey(num - 1))
                continue;
            int curLength = 0;
            int curNum = num;
            while(ht.ContainsKey(curNum++))
                curLength++;
            resLength = Math.Max(curLength,resLength);
        }
        return resLength;

    }
}

你可能感兴趣的:(C#题解,算法,数据结构)