题目地址:
https://leetcode.com/problems/contiguous-array/
给定一个长 n n n的 0 − 1 0-1 0−1数组 A A A,求其最长的 0 0 0的个数等于 1 1 1的个数的子数组的长度。
考虑将每个 0 0 0变为 − 1 -1 −1,那么本题即为求最长的和为 0 0 0的子数组长度,可以用前缀和的思想来做。开一个哈希表,key是前缀和,value是该前缀和对应的最左边的下标。遍历 A A A,维护一个前缀和变量,如果哈希表里存在这个前缀和作为key,那么就找到了以当前位置为右端点的最长的和为 0 0 0的子数组的左端点减 1 1 1的位置,那么子数组的长度就得出来了。代码如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int findMaxLength(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
int res = 0;
for (int i = 0, sum = 0; i < nums.length; i++) {
sum += nums[i] * 2 - 1;
if (map.containsKey(sum)) {
res = Math.max(res, i - map.get(sum));
} else {
map.put(sum, i);
}
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。