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

最长无重复子数组

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

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param arr int整型一维数组 the array
 * @return int整型
 */
//滑动窗口;每次都计算下当前符合的滑动窗口的长度;滑动窗口的右边界是确认的;确定下滑动窗口的左边界是
func maxLength(arr []int) int {
	// write code here
	res := 0
	tmpMap := make(map[int]int, 0)
	//滑动窗口开始位置
	start := 0
    //i是确定的滑动窗口的右边界;只需要确定左边界的位置即可
	for i, v := range arr {
		if p, ok := tmpMap[v]; ok {
			//分两种情况:重复的元素在滑动窗口起始位置的右侧?p>start; start = p+1
			//p==start; -> start = p+1
			//p<start; 滑动不需要变化滑动窗口; start = start
			//滑动窗口指定新的位置;有可能遇到的重复元素还在滑动窗口的左侧,这种情况就不管
			if start <=p {
				start = p+1
			}
		}
		//计算前一段最长序列;存在重复元素,需要重新开始新的窗口;把重复元素之前的数据都可以删掉
		//滑动窗口的终止位置是i-1;长度计算i-1-start+1
		tmpLen := i - start+1
		if tmpLen > res {
			res = tmpLen
		}
		//滑动窗口,更新元素的靠后位置
		tmpMap[v] = i

	}
	return res
}

全部评论

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 19:05
面试官_我太想进步了:混学生会的,难怪简历这么水
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务