题目描述
Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1.
1
2
3Input: [0,1]
Output: 2
Explanation: [0, 1] is the longest contiguous subarray with equal number of 0 and 1.
1 | Input: [0,1,0] |
解析
这是一个题目描述得特别简单的题,不过思路比较tricky,题目要求求一个只含0和1的数组中最长的,含有相同数量0和1的子数组的长度,暴力法O(n^2)遍历所有子数组,这个不难想到,不过题目说数组长度会有50000,有大概率会超时。
一个Tricky的方法是遍历数组一次,设置一个count,每次遇到1则加一,遇到0则减一,如果同样的count出现两次,则两个index之间的0和1出现次数相等,有一点统计出现一半以上的数字那道题的感觉,也是遇到+1,没有遇到-1,Leetcode官方题解里有一个图很好地说明了这个intuition的原理:
这里我们需要用一个HashMap存储count与第一次出现该count的index的对应关系,便于日后查找, 具体代码如下
1 | public int findMaxLength(int[] nums) { |
总结
一个描述十分简单的题目,很有意思的一个小技巧,从O(N^2)到O(N)的优化,挺适合作为面试题,不过如果以前没有见过这个技巧,可能很难再面试时期想出,所以,还是要多刷题呀~~