题解 | #最长无重复子数组#
最长无重复子数组
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 }