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