最短无序连续子数组
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
示例1
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
示例2
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。
思路
- 本题使用了map+前缀和的思想求解。要求连续子数组含有相同数量0和1的连续子数组。
- “连续子数组”,也就说是使用前缀和的思想:
计算nums[i]到nums[j]之间的序列和=dp[j+1]-dp[i]
- “含有相同数量0和1”,也就说0和1的数量之差为0。在本题中定义了一个变量count,如果为nums[i]为0,则加1,否则减1。
- 结合起来说就是:如果计算nums[i]到nums[j]之间的0和1的数量差为0,则时说明在i处的0和1的数量差和在j处的0和1的数量差相等。
- 定义一个map存放结果,其中key为0和1的数量差(count),value为下标。
解法
func findMaxLength(nums []int) int {
maxValue:=0
hashMap:=make(map[int]int,len(nums))
hashMap[0]=-1
count:=0
for i:=0;i<len(nums);i++{
if nums[i]==0{
count++
}else{
count--
}
if index,ok:=hashMap[count];ok{
maxValue=max99(maxValue,i-index)
}else{
hashMap[count]=i
}
}
return maxValue
}
func max99(a,b int)int{
if a>b{
return a
}
return b
}