P525 连续数组


题目

image-20210603083656894

分析

  • 关键词检索:最长连续子数组,又到了喜闻乐见的前缀和哈希表环节
  • 0,1个数相等,如果将0转化为-1,它们的和将为0,将题目转化为求和为零的最大连续子数组
  • 在map中先放入(0,-1),我们认为前0项和为0,位于-1(常规操作啦)
  • 遍历数组,用一个变量保存当前的前n项和,遇到0视为-1
  • 如果在map中找到key = 当前前n项和,那就说明从map中取出的index+1到i的数组和为零(有相同个0,1)

显然,如果两个连续子数组和相等,而且是包含关系,那么大的数组减去小的数组后的和为0

  • 这个子数组的长度可以用i-index来计算出
  • 如果找不到就将当前的前n项和以及索引加入map,因为要找最大的连续子数组,所以没必要更新

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int findMaxLength(int[] nums) {
int prev = 0;
HashMap<Integer, Integer> map = new HashMap<>();
int max = 0;
map.put(0,-1);
for (int i = 0; i < nums.length; i++) {
prev += nums[i] == 0 ? -1 : 1;
if (map.containsKey(prev)) {
max = Math.max(i - map.get(prev), max);
} else {
map.put(prev, i);
}
}
return max;
}
}

image-20210603084119499

一点屁话

  • 感觉每次做这类题都差点感觉
  • 还是做得少

← Prev P160 相交链表 | P523 连续的子数组和 Next →