[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   新西兰程序员  阅读(8)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2016-11-29 常用的网站站长SEO工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示