class Solution {
public int findMaxLength(int[] nums) {
// 把 0 变为 -1
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0)
nums[i] = -1;
}
// 记录前缀和到下标的映射
Map<Integer, Integer> sumToIndex = new HashMap<>();
// 边界条件,空数组对应下标为 -1
sumToIndex.put(0, -1);
// 记录前缀和
int sum = 0;
// 记录结果
int res = 0;
// 遍历数组下标,和为 0 的最长中间子数组即为结果
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (sumToIndex.containsKey(sum)) {
res = Math.max(res, i - sumToIndex.get(sum));
}
else {
// 更新前缀和对应下标
sumToIndex.put(sum, i);
}
}
return res;
}
}
08-04
231
08-20
518
08-20
387