在Go(Golang)中找出0和1数量相同的连续子数组的最大长度的方法

100 阅读1分钟

概述

给出一个只有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数组,找到索引ij,使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