【LeetCode】525.最短无序连续子数组

171 阅读1分钟

最短无序连续子数组

给定一个二进制数组 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
}