leetcode 剑指 Offer II 011. 0 和 1 个数相同的子数组

90 阅读1分钟

[toc] leetcode 剑指 Offer II 011. 0 和 1 个数相同的子数组

题目描述

剑指 Offer II 011. 0 和 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 的最长连续子数组。

提示:

1 <= nums.length <= 105 nums[i] 不是 0 就是 1

解题思路

法1

哈希表:

使用一个哈希表counts来存储每个累计计数值(count)首次出现的索引位置。

在遍历数组nums时,对于每个元素,如果遇到0,则计数count减1;

如果遇到1,则计数count加1。

然后,检查当前计数值是否已经在哈希表counts中存在。

如果存在,说明从当前索引到哈希表中存储的索引之间的子数组具有相同数量的0和1,计算子数组的长度,并更新最大长度maxLength。

如果不存在,将当前计数值和索引存储到哈希表counts中。

最终,函数返回的maxLength即为含有相同数量的0和1的最长连续子数组的长度。

  • 时间复杂度(O(n))
  • 空间复杂度(O(n))

遍历每个子数组

使用两个循环遍历每个>2的子数组是否满足1的个数==0的个数的条件,找出最大的子数组

返回最大子数组的长度

  • 时间复杂度(O(n^2))
  • 空间复杂度(O(1))

执行结果

法1

func findMaxLength(nums []int) int {
	counts := make(map[int]int)
	counts[0] = -1
	maxLength, count := 0, 0

	for i, num := range nums {
		if num == 0 {
			count--
		} else {
			count++
		}

		if idx, ok := counts[count]; ok {
			length := i - idx
			if length > maxLength {
				maxLength = length
			}
		} else {
			counts[count] = i
		}
	}

	return maxLength
}

本文由mdnice多平台发布