题目:LCR 011
解法一:前缀和 + 哈希表优化
将含有相同个数0和1的问题转化为子数组和的问题,当将0转换为-1后,含有相同个数-1和1的子数组sum固定为0,因此只需使用 LCR 010 的“前缀和+哈希表”解法即可解决
class Solution {
public int findMaxLength(int[] nums) {
int sum = 0, res = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i] == 0 ? -1 : nums[i];
if (map.containsKey(sum)) res = Math.max(res, i - map.get(sum));
else map.put(sum, i);
}
return res;
}
}
注意:
- 与LCR 010不同的是,此处要求的是数组长度,而非子数组个数,因此
map
中要存储的是<前缀和,第一次出现该前缀和索引> - 之所以存储的是第一次出现该前缀和的索引是因为计算
i - map.get(sum)
时,map.get(sum)
越小,子数组长度越大 if
条件中的map.containsKey(sum)
可以看作map.containsKey(sum-0)