思路
这题代码的要求为o(n)复杂度,那就只能空间来换时间了,O(n)常常与哈希表相关。本题的思路也在于哈希表的解法。
遍历每个元素,如果元素不存在于哈希表的话,也就是新数加入就为其创建一个键值对。这个键值对的val代表的意思为加入了这个字符之后,这个字符所在的(组成)序列长度为多少。如果是旧数加入的话,因为最长的肯定用过它,如果没用过它,它也撼动不了最长的地位,这个序列的某个位置加入才会使它变长,也就是说这旧数的加入没有意义,就没有必要加进来。
那么这个新加入的数字怎么样知道自己的出现会不会导致所在的序列变为最长呢?那就左边一个数字的长度+右边一个数组的长度+1,最后判断一下是否超越最长。
注意:本题最需要注意的一个点就是比如23456这个序列新加入了这个4的话导致这个字符串变为最长之后,如果再来个1或者7,如果没有改变1右边或者7左边的数字所在的长度就不会有最新的长度,这时就是错误的,所以需要更新这个序列的两个端点。(为什么不更新中间的端点?因为相同的端点不会再进行加入,因为撼动不了最长的长度,所以此时只需要更新两个端点值即可)
代码示例
func longestConsecutive(nums []int) int {
result:=0
m:=make(map[int]int)
for i:=0;i<len(nums);i++{
if _,ok:=m[nums[i]];!ok{
leftL,_:=m[nums[i]-1]
rightL,_:=m[nums[i]+1]
m[nums[i]]=leftL+rightL+1
m[nums[i]-leftL]=m[nums[i]]
m[nums[i]+rightL]=m[nums[i]]
if m[nums[i]]>result{
result=m[nums[i]]
}
}
}
return result
}