31. 连续数组
题目描述: 给定一个二进制数组 nums,找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
解法思路: 这道题的核心在于转换视角。既然要找 0 和 1 数量相同的区间,不妨把 0 看作 -1,1 看作 1。这样问题就转化为了寻找和为 0 的最长子数组。
我们维护一个前缀和 sum,并用哈希表记录每个前缀和第一次出现的下标。如果当前前缀和之前出现过,说明中间这段区间的和为 0。这里有个细节要注意:初始化时 hash[0] = -1,是为了处理从索引 0 开始的子数组情况。

C++ 代码实现:
class Solution {
public:
int findMaxLength(vector<int>& nums) {
unordered_map<int, int> hash;
hash[0] = -1; // 默认前缀和为 0 的情况有一个,但这里注意我们的后面一个 int 是存下标的
int sum = 0, ret = 0;
for(int i = 0; i < nums.size(); i++) {
sum += nums[i] == 0 ? -1 : 1; // 计算当前位置的前缀和,并且数组中为 0 的改成 -1
if(hash.count(sum)) {
ret = max(ret, i - hash[sum]);
} else {
hash[sum] = i;
}
}
return ret;
}
};
32. 矩阵区域和
题目描述: 给你一个 m x n 的矩阵 mat 和一个整数 k,请你返回一个矩阵 answer,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:
- i - k <= r <= i + k, j - k <= c <= j + k



