go语言LeetCode刷题笔记
Hot100系列
第128题最长连续序列
思路:先使用hash表去重,遍历hash表元素,查找当前元素是否有比他大的,有则继续往下找。
比如当前元素是5,则寻找表中是否有6,有则继续找6,无则终止,记录当前最大序列长度。
当然,这里可以进行时间上的优化。比如说我们当前的元素是5,那么我们查询是否有元素6之前,可以先查询是否有元素4,如果有,则可以中止本次查询。因为如果元素4存在的话,那么必然元素4的最长序列比元素5的最长序列大。(从4开始的序列必然比5的序列大1)
func longestConsecutive(nums []int) int {
//先使用hash表去重
m := make(map[int]bool)
for _, num := range nums {
m[num] = true
}
res := 0
//然后遍历m,每一个元素查找比他更大的元素,记录最大连续
for k, _ := range m {
if !m[k-1] { //优化时间复杂度, 如果存在m[k-1],则证明一定有比当前更长的序列。(显然从k-1开始的会比从k开始的更长)
cur := k + 1
longest := 1
for m[cur] {
cur++
longest++
}
if res < longest {
res = longest
}
}
}
return res
}