前缀和思想:遍历数组,遇到
0
则前缀和减1
,遇到1
则前缀和加1
。如果数组中前i
个数字之和为sum
,前j
个数字(j > i)
之和也为sum
,那么从第i +
个数字到第j
个数字的子数组之和为0
,这个和为0
的子数组长度是j - i
。
class Solution {
public:
int findMaxLength(vector<int>& nums) {
if (nums.empty()) return 0;
//只有前缀和不为0的才存入哈希表,哈希表第一个元素存放非零前缀和,第二个元素存放该前缀和的位置
//(从数组头部到第i个元素的前缀和中,i就是该前缀和的位置)。
unordered_map<int, int> hash;
hash[0] = -1;
int sum = 0;
int maxLength = 0;
for (int i = 0; i < nums.size(); ++ i)
{
sum += nums[i] == 0 ? -1 : 1; //判断当前元素是否为0
if (hash.count(sum)) //如果能在哈希表中找到当前的前缀和
{ //说明从哈希表中前缀和位置到当前位置的子数组和为0
maxLength = max(maxLength, i - hash[sum]);
}
else hash[sum] = i; //存入非零前缀和的位置
}
return maxLength;
}
};