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