最开始没读清楚题目觉得好难啊。。。
直接的方法是将数组排序,然后遍历记录连续的长度。
func longestConsecutive(nums []int) int {
// 检查为空的情况
if len(nums) == 0{
return 0
}
sort.Ints(nums)
max, count := 1, 1
for i:=1; i<len(nums); i++ {
if nums[i-1]+1 == nums[i]{
count++
// fmt.Println(count)
} else if nums[i-1]==nums[i]{
// 等于的情况无事发生
} else { // 切换到下一个连续序列
if count > max {
max = count
}
count = 1
}
}
// 对最后一个连续序列赋值
if count > max {
max = count
}
return max
}
题目提示的hash解法要结合题意来看——不断地检查“当前数 + 1”是否存在于数组中,来扩展这个序列。
但是写着写着发现存入map之后呢,怎么去遍历呢?连续序列的起点是:当前数 - 1”不在集合中,又是一轮遍历
func longestConsecutive(nums []int) int {
// 检查为空的情况
if len(nums) == 0{
return 0
}
m := make(map[int]struct{})
for i:=0; i<len(nums); i++ {
m[nums[i]] = struct{}{}
}
// 收集起始点
start := make([]int, len(nums))
for i:=0; i<len(nums); i++ {
if _, ok := m[nums[i]-1]; !ok {
start = append(start, nums[i])
}
}
max, count := 0, 0
for _, v := range start {
count = 0
_, ok := m[v]
for ok {
count++
v += 1
_, ok = m[v]
}
if count > max {
max = count
}
}
return max
}
这份代码竟然超时了,于是乎,优化一下看看能通过。
func longestConsecutive(nums []int) int {
// 检查为空的情况
if len(nums) == 0{
return 0
}
m := make(map[int]struct{})
for i:=0; i<len(nums); i++ {
m[nums[i]] = struct{}{}
}
max, count := 0, 0
for k, _ := range m {
if _, ok:=m[k-1]; !ok{ // 作为起始点
count = 0
_, ok = m[k]
for ok {
count++
k += 1
_, ok = m[k]
}
}
if count > max {
max = count
}
}
return max
}
并查集的解法放到另一个并查集总结的文章中,等我写了那个文章就来放链接。