1. 问题定义与理解
今天我们来解决一个有趣的数组问题:寻找最长平衡子数组。给定一个整数数组nums,我们需要找到一个连续的子数组,满足去重后偶数和奇数的数量相等。这个问题看似简单,但其中蕴含着一些值得深入探讨的算法思想和优化技巧。
首先明确几个关键概念:
- 子数组:必须是原数组中连续的元素序列
- 去重:只关心数字是否出现过,不关心出现次数
- 平衡:去重后奇数和偶数的种类数相等
举个例子,对于数组[2,5,4,3]:
- 子数组[2,5]去重后:偶数{2},奇数{5} → 1:1 → 平衡
- 子数组[2,5,4]去重后:偶数{2,4},奇数{5} → 2:1 → 不平衡
- 整个数组[2,5,4,3]去重后:偶数{2,4},奇数{5,3} → 2:2 → 平衡
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法分析与实现
2.1 基本思路
最直观的解法就是暴力枚举所有可能的子数组,然后检查每个子数组是否满足平衡条件。具体步骤如下:
- 遍历所有可能的子数组起点i
- 对于每个起点i,遍历所有可能的终点j(j≥i)
- 对于子数组nums[i..j],统计其中去重后的奇数和偶数数量
- 如果两者数量相等,则更新最大长度
2.2 Go语言实现
go复制func longestBalanced(nums []int) int {
maxLen := 0
for i := 0; i < len(nums); i++ {
odd := make(map[int]bool)
even := make(map[int]bool)
for j := i; j < len(nums); j++ {
if nums[j]%2 == 1 {
odd[nums[j]] = true
} else {
even[nums[j]] = true
}
if len(odd) == len(even) {
if j-i+1 > maxLen {
