Think of 1 as push, 0 as pop, the whole stack goes up and down.

Keep tracking the height of the stack, find which height reoccurs after longest interval.

```
class Solution(object):
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# longest is a dict, key is the height of the stack, first element of value is its first index, second element is the reoccur interval
sums, longest = 0, {0:[-1,0]}
for idx, i in enumerate(nums):
# increase height when meet 1, decrease when meet 0
sums += (i or -1)
# update the dict
longest[sums] = [longest[sums][0] if sums in longest else idx, idx - (longest[sums][0] if sums in longest else idx) ]
return max(map(lambda x:x[1], longest.values()))
```