剑指 Offer II 011. 0 和 1 个数相同的子数组
前缀和 + HashMap
- 问题:为什么在 HashMap 找到相同的前缀和就能表示找到了一串连续数组呢? 假如 hashMap 存储 -1 的值索引值为 i,当前索引值为 j,
那么区间 [i + 1, j] 的前缀和为 0,这是我们要求的连续数组,所以就可以从 hashmap 中取出 -1 的索引值构成连续数组。 - base case 包含 (0, -1) 这种情况,否则计算出错。
- 向这种前缀和 + HashMap 主要的思想就是当 [0,i] 的前缀和等于 [0, j] 的前缀和时, [i+1, j] 这一部分区间的特性。比如这一题当遇到 0 时就比较巧妙,
这样就使得前面条件成立时,区间[i + 1, j] 的前缀和为0。 ```java
class Solution {public int findMaxLength(int[] nums) {if (nums == null || nums.length == 0) return 0;int sum = 0, maxLen = 0;Map<Integer, Integer> index = new HashMap<>();// base caseindex.put(0, -1);for (int i = 0; i < nums.length; i++) {if (nums[i] == 0) {sum -= 1;} else {sum += 1;}if (index.containsKey(sum)) {maxLen = Math.max(maxLen, i - index.get(sum));} else {index.put(sum, i);}}return maxLen;}}
```
