[LeetCode-哈希-中等] 最长连续序列

这道题是这样的,给你一个没有排序的整形数组 intArr, 要求找出这个数组中数字连续的最长序列 (不要求序列元素在原数组中连续)的长度

需要写出一个时间复杂度为O(n)的算法

比如 intArr = [70,8,100,6,7,5]  应该返回4, 因为最长的数字连续序列是 [5,6,7,8]  它的长度为4

intArr = [0,6,3,1,4,2,5,3]  应该返回7, 因为最长为[0,1,2,3,4,5,6]

 这个题目,刚开始一看,感觉先应该对intArr中的整数进行从小到大排序,但其实是不用的

这个题目有一个点是需要注意的,就是有可能原始的数组intArr中有重复的元素的存在,我们是不用去考虑重复的元素的 =》 所以会想到用C#中的HashSet来处理,因为HashSet中不允许有重复元素出现

1. 我们把这个数组intArr中的不重复值都放入到HashSet中

2. 对HashSet

 

 

 

public int GetlongestArray(int[] intArr)
        {
            var intSet = new HashSet<int>();
            for (var i = 0; i < intArr.Length; i++)
            {
                intSet.Add(intArr[i]); //如果发现重复元素存在,将不会添加进去
            }

            var longestArray = 0;  //返回值

            //循环遍历HashSet中的每一个元素
foreach (var num in intSet) {
//如果HashSet中不包含当前元素值-1的这样一个值,说明当前元素是一个连续序列的开始(连续序列的第一个元素) =》 这个连续序列也有可能就包括它一个元素
if (!intSet.Contains(num - 1))
{
//初始化当前连续序列的开始元素和长度
var currentNum = num; var currentCount = 1; //如果HashSet中包含当前元素值+1的结果,说明连续序列还在往下走 while (intSet.Contains(num + 1)) {
//及时更新当前连续序列的当前元素和当前长度 currentNum
+= 1; currentCount += 1; } longestArray = Math.Max(longestArray, currentCount); } } return longestArray; }

 

posted on 2023-11-29 19:52  新西兰程序员  阅读(5)  评论(0编辑  收藏  举报