赞
踩
参考:
https://blog.csdn.net/qq_26410101/article/details/88538744
用哈希表做,键为数字,值为遍历到该数字时它所在连续序列的长度。
在新遍历一个数字n时,如果该数字在哈希表中不存在,那么此时如果哈希表中有n-1或者n+1,那么n-1或者n+1一定是一个连续序列的边界点,因此再加入n元素后,可以将n-1所在序列(如果存在的话),n以及n+1所在的序列(如果存在的话)连成一个新序列,此时需要将新序列的两端边界的哈希值进行修改为新序列的长度。
class Solution { public: int longestConsecutive(vector<int>& nums) { int res = 0; unordered_map<int, int> m; for (int n : nums) { if (m.find(n) == m.end()) { //如果n已经存在哈希表中则什么也不做 int left = m.find(n-1)==m.end()?0:m[n - 1]; //找到数字n-1所在序列的长度,也是哈希表中n左边元素(连续的)的个数 int right = m.find(n+1)==m.end()?0:m[n + 1]; //找到数字n+1所在序列的长度,n右边元素的个数 res = max(res, left + right + 1); //更新最大值res,加入n后,n所在序列的长度为left+right+1 m[n] = left + right + 1; //加入n元素对应的值,更新n对应值的原因是下次当相同数字n到来时,查找哈希表已经存在就直接跳过 m[n - left] = left + right + 1; //n左边有left个元素,且是连续的,因此左边界元素就是n-left m[n + right] = left + right + 1; //n右边有right个元素且连续,因此右边界元素为n+riught } } return res; } };
以[100, 4, 200, 1, 3, 2]为例,遍历过程如下:
括号里的为值,前面的数字为键
100(1)
100(1),4(1)
100(1),4(1),200(1)
100(1),4(1),200(1),1(1)
100(1),4(2),200(1),1(1),3(2) //3的left为0,right为1,因此3的值为1+1=2,3的右边界4更新为2
100(1),4(4),200(1),1(4),3(2),2(4)//2的left为m[1]=1,right为m[3]=2,因此2的值为1+2+1=4,左边界m[2-1]更新为4,右边界m[2+2]更新为4,即更新了4,1,2为4,而3未更新,因为他不是边界不需要更新
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。