题解 | #最长无重复子数组#

最长无重复子数组

http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

package main

/**
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
*/
func maxLength( arr []int ) int {
    // write code here
    max := 1
    for i:=0; i< len(arr)-1; i++ {
        exist := make(map[int]int)
        count := 0
        if arr[i] == arr[i+1] {
            continue
        }

        exist[arr[i]] = i
        count += 1
        for j:=i+1; j<len(arr); j++{
            if index, ok := exist[arr[j]]; ok {
                i = index
                break
            }
            exist[arr[j]] = j
            count += 1  
        }
        if count > max {
            max = count
        }

    }
    return max

}

在第一版当中 我们的exist 为map[int]bool, 代码如下:

package main

/**
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
*/
func maxLength( arr []int ) int {
    // write code here
    max := 1
    for i:=0; i< len(arr)-1; i++ {
        exist := make(map[int]bool)
        count := 0
        if arr[i] == arr[i+1] {
            continue
        }

        exist[arr[i]] = i
        count += 1
        for j:=i+1; j<len(arr); j++{
            if _, ok := exist[arr[j]]; ok {

                break
            }
            exist[arr[j]] = true
            count += 1  
        }
        if count > max {
            max = count
        }

    }
    return max

}

这个代码是无记忆的,对于 1232456,第一遍123 遇到2终止;第二遍从2开始,遇到2终止;这里面其实是没必要的,遇到2之后,后续最大的只可能从前一个2的index开始,所以我们直接将i跳转到index,后续的i++,使其指向index+1,从这个地方开始遍历,可以极大的减少搜索次数。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-23 18:33
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务