525 Contiguous Array
Approach 1 Prefix Sum + Hash Table
prefix sum + hash table擅长解决subarray sum == target的问题, 但这一题则有点不一样, 给的binary array, 我们需要找到最长的subarray, 使得0和1的数量相等. 要用到一个trick, 把所有的0转化为-1,这样这个问题就等价于找到最长的subarray sum == 0, 如下例子
# 原数组
[0, 1, 0, 1, 0, 1]
# 转化后的数组
[-1, 1, -1, 1, -1, 1]
sum[j:i] => prefix_sum[i] - prefix_sum[j-1]
case 1:
-------------------
x x x [x x x]
j-1 j i
case 2 (edge case):
-------------------
[x x x] x x x
-1 0 1 i
Code Implementation
class Solution:
def findMaxLength(self, nums: List[int]) -> int:
hashtable = dict()
hashtable[0] = -1
prefix_sum = 0
res = 0
for i,num in enumerate(nums):
if num == 1:
prefix_sum += 1
else:
prefix_sum -= 1
if prefix_sum in hashtable:
res = max(res,i - hashtable[prefix_sum])
else:
hashtable[prefix_sum] = i
return res