这道题给我们一个数组,数组只包括0和1,让我们找出1的个数和0的个数相等的连续子数组,这样的数组可能有多个,让我们返回最长子数组的长度
解答:
这道题让我们求1的个数和0的个数相等的连续子数组,如果用-1表示0,1还用1表示,1的个数和0的个数相等表示这个子数组的和为0。用sum表示数组的前i个元素的和,如果从i+1到j的子数组的和为0,则i位置的sum值和j位置的sum值相同,子数组元素的个数为j - i。
1 用max表示和为0的子数组的最大长度
2 用-1表示0,1还用1表示。
3 用sum表示遍历位置i时前缀数组和。
4 用map记录sum和i的值。
5 当遍历到位置i,如果map中有sum的值,表示存在子数组和为0,更新max
public int findMaxLength(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
int sum = 0;
int maxLen = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i] == 1 ? 1 : -1;
if (map.containsKey(sum)) {
maxLen = Math.max(maxLen, i - map.get(sum));
} else {
map.put(sum, i);
}
}
return maxLen;
}