题目描述:

解:
题目要求0和1数量相同的最长子数组,假如将0看做-1,那就是和为0的最长子数组。
那么依然是先做前缀和处理。然后通过哈希表记录某个前缀和出现的最小下标(以求最大子数组)
class Solution {public int findMaxLength(int[] nums) {int n = nums.length;int[] sum = new int[n+1];for (int i = 1; i <= n; i++) {sum[i] = sum[i-1] + (nums[i-1] == 0 ? -1 : nums[i-1]); //前缀和处理}int ret = 0;Map<Integer, Integer> map = new HashMap<Integer, Integer>();map.put(0,0);for(int i = 2; i <= n; i++) {if(!map.containsKey(sum[i-2])) {map.put(sum[i-2], i-2); //记录最左端点}if(map.containsKey(sum[i])) {ret = Math.max(ret, i-map.get(sum[i]));}}return ret;}}
