题解 | #基于Go语言的最长无重复子数组的解法#
最长无重复子数组
http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
概述
整个算法的核心思想是采用滑动窗口的方式来找到最大无重复子数组的长度,要注意的有两点:滑动窗口的左边界一定要排除掉滑动窗口中出现重复的数值.
算法步骤描述:
step0. 输入数组arr;
step1. 初始化空字典set;
step2. 初始化左边界left=0;
step3. 初始化最大长度为maxlen=0;
step4. 初始化右边界right=0;
step5. 判定right<数组arr的长度是否成立,成立执行step6;否者,跳转到step11;
step6. 判定字典set中是否存在键值对arr[right]:right,存在,执行step7;否者,执行step8;
step7. 从字典中删除键值对arr[left]:left;left++,right--;
step8. 更新set中键值对arr[right]:right;
step9. 判定maxlen<right-left+1是否成立,成立则计算maxlen=right-left+1;
step10. right++,跳转到step5;
step11. 输出结果maxlen。
代码1 统计字典set中元素的个数确定无重复子数组长度。
package main
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
func maxLength( arr []int ) int {
// write code here
set:=make(map[int]int)
left:=0
maxlen:=0
for right:=0;right<len(arr);right++{
if _,ok:=set[arr[right]];ok==true{
if left<right{
delete(set,arr[left]) // remove element not existed in slipping window.
left++
right--
}
}
set[arr[right]]=right // update v:k
if maxlen < len(set){
maxlen=len(set)
}
}
return maxlen
}
代码2:
计算根据左边界和有边界的个数确定无重复子数组长度:
package main
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
func maxLength( arr []int ) int {
// write code here
set:=make(map[int]int)
left:=0
maxlen:=0
for right:=0;right<len(arr);right++{
if _,ok:=set[arr[right]];ok==true{
if left<right{
delete(set,arr[left]) // remove element not existed in slipping window.
left++
right--
}
}
set[arr[right]]=right // update v:k
if maxlen < right-left+1{
maxlen=right-left+1
}
}
return maxlen
}