概述
给出一个只有0和1的数组。目的是找到一个0和1数量相等的最大长度的子数组。让我们通过例子来理解它
例子1
Input: intervals = [0, 1]
Output: 2
例二
Input: intervals = [0, 1, 1, 0, 1, 1]
Output: 4
以下是我们可以采取的方法:
-
我们将创建一个数组leftSum,其中leftSum[i]将表示从索引0到i的数字之和,将0视为-1,1视为1。
-
现在有两种情况。子数组从索引0开始或者子数组从0以外的索引开始。
-
从左到右扫描leftSum数组。如果leftSum中任何一个索引的值都是0,那么就意味着subarray[0,i]中包含的0和1的数量相等。 如果子数组从索引0开始,这将得到答案。
-
如果子数组不从0开始。所以再次扫描leftSum数组,找到索引i和j,使leftSum[i]== leftSum[j]。 为了弄清楚这个问题,我们将使用一个地图。如果j-i的长度大于最大长度,那么就更新最大长度
-
最后返回最大长度
程序
下面是同样的程序。
package main
import "fmt"
func findMaxLength(nums []int) int {
lenNums := len(nums)
if lenNums == 0 {
return 0
}
currentSum := 0
sumLeft := make([]int, lenNums)
for i := 0; i < lenNums; i++ {
if nums[i] == 0 {
currentSum = currentSum - 1
} else {
currentSum = currentSum + 1
}
sumLeft[i] = currentSum
}
maxLength := 0
max := 0
min := 0
for i := 0; i < lenNums; i++ {
if sumLeft[i] == 0 {
maxLength = i + 1
}
if sumLeft[i] > max {
max = sumLeft[i]
}
if sumLeft[i] < min {
min = sumLeft[i]
}
}
numMap := make(map[int]int, max-min+1)
for i := 0; i < lenNums; i++ {
index, ok := numMap[sumLeft[i]]
if ok {
currentLength := i - index
if currentLength > maxLength {
maxLength = currentLength
}
} else {
numMap[sumLeft[i]] = i
}
}
return maxLength
}
func main() {
output := findMaxLength([]int{0, 1})
fmt.Println(output)
output = findMaxLength([]int{0, 1, 1, 0, 1, 1})
fmt.Println(output)
}
输出
2
4