【剑指offer】NC41 最长无重复子数组 [Go语言]

264 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。 子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

示例1

输入:

[2,3,4,5]

返回值:

4
说明:
[2,3,4,5]是最长子数组        

示例2

输入:

[2,2,3,4,3]

返回值:

3
说明:
[2,3,4]是最长子数组        

思路

这是一道很经典的滑动窗口的题目,我们可以直接套下面的模板进行双指针解题目

for (右指针没有到结尾){
    窗口扩大,加入right对应元素,更新当前result
    for (result不满足要求){
        窗口缩小,移除left对应元素,left右移
    }
    更新最优结果bestResult
    right++
}
return bestResult

AC Code

func maxLength( arr []int ) int {
    // write code here
(1)    left, maxLen := 0, 0
(2)    s := make([]int,1000000)  
       // 维持一个切片,值当作index,次数当作value
(3)    for i:=0;i<len(arr);i++{
(4)        s[arr[i]]++
(5)        for left <= i && s[arr[i]] > 1 {
(6)            s[arr[left]]--
(7)            left++
        }
(8)        if i-left+1>maxLen{
(9)            maxLen = i - left + 1
        }
    }
    return maxLen
}
  • (1) 声明一个遍历的左指针,以及最大的长度
  • (2) 声明并维持一个切片,存储所有的index在这里,并且记录次数
  • (3) 进行循环,一个一个遍历数组的个数,这个i充当右指针
  • (4) 给每个数字进行存储并且记录出现的次数
  • (5) 当这个左指针小于右指针,并且 遍历到的这个值大于1的话,就是之前已经出现过了
  • (6) 那么我们就减去arr[right]的值,就是把右指针为下标的值丢弃。
  • (7) 执行right++操作,就是移动右指针
  • (8) 如果这个右边下标减去左边长度要大于最大的长度的时候
  • (9) 就赋值给maxLen