目标
给你一个整数数组 nums。
如果子数组中 不同偶数 的数量等于 不同奇数 的数量,则称该 子数组 是 平衡的 。
返回 最长 平衡子数组的长度。
子数组 是数组中连续且 非空 的一段元素序列。
示例 1:
输入: nums = [2,5,4,3]
输出: 4
解释:
最长平衡子数组是 [2, 5, 4, 3]。
它有 2 个不同的偶数 [2, 4] 和 2 个不同的奇数 [5, 3]。因此,答案是 4 。
示例 2:
输入: nums = [3,2,2,5,4]
输出: 5
解释:
最长平衡子数组是 [3, 2, 2, 5, 4] 。
它有 2 个不同的偶数 [2, 4] 和 2 个不同的奇数 [3, 5]。因此,答案是 5。
示例 3:
输入: nums = [1,2,3,2]
输出: 3
解释:
最长平衡子数组是 [2, 3, 2]。
它有 1 个不同的偶数 [2] 和 1 个不同的奇数 [3]。因此,答案是 3。
说明:
- 1 <= nums.length <= 1500
- 1 <= nums[i] <= 10^5
思路
定义平衡子数组是 不同奇数元素个数 与 不同偶数元素个数 相等的子数组,求数组 nums 的平衡子数组的最大长度。
暴力解法是枚举所有可能的子数组,判断是否是平衡子数组,即子数组中不相同奇数个数与不相同偶数个数是否相等。
无需针对每一个子数组都重新计数,考虑使用两个哈希表分别记录奇数元素与偶数元素的出现次数,判断哈希表中的 key 的个数是否相等即可。注意针对每一个起点,需要重新初始化哈希表。
代码
/**
* @date 2026-02-10 9:16
*/
public class LongestBalanced3719 {
public int longestBalanced(int[] nums) {
int n = nums.length;
int res = 0;
for (int i = 0; i < n; i++) {
Map<Integer, Integer>[] map = new HashMap[2];
Arrays.setAll(map, x -> new HashMap<>());
int l = nums[i] % 2;
map[l].merge(nums[i], 1, Integer::sum);
for (int j = i + 1; j < n; j++) {
int r = nums[j] % 2;
map[r].merge(nums[j], 1, Integer::sum);
if (map[l].size() == map[l ^ 1].size()) {
res = Math.max(res, j - i + 1);
}
}
}
return res;
}
}
性能
