128最长连续序列解题记录

最开始没读清楚题目觉得好难啊。。。

直接的方法是将数组排序,然后遍历记录连续的长度。

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
}

并查集的解法放到另一个并查集总结的文章中,等我写了那个文章就来放链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值