# 连续数组open in new window
给定一个二进制数组
nums, 找到含有相同数量的0和1的最长连续子数组,并返回该子数组的长度。
# 思路
- 相同的 1 和 0 ,可以把
0换为-1,那么就是连续的 1和-1 的和为 0 的子数组的长度 - 是一个前缀和问题
- 先计算任意前缀和的值,并利用哈希表记录下标和值。
- 遍历数组。碰到
1时 sum+1,碰到0时 sum-1。 - 判断sum值是否出现在哈希表上,如果是,比较当前下标和哈希表记录的下标的差与最大长度,取最大值。
- 哈希表中没有,记录。
public class ContiguousArray {
public static int findMaxLength(int[] nums) {
Map<Integer, Integer> h = new HashMap<>();
int max = 0;
int sum = 0;
h.put(sum, -1);
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 1) {
sum++;
} else {
sum--;
}
if (h.containsKey(sum)) {
max = Math.max(max, i - h.get(sum));
} else {
h.put(sum, i);
}
}
return max;
}
public static void main(String[] args) {
System.out.println(findMaxLength(new int[]{0, 1, 1, 1, 0, 0, 0}));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 思路2
- 因为是求连续相同的子数组最长的的长度,还可以用朴素的二次遍历的方法。
思考过滑动窗口,但是并不知道行不通。