企业网站建设方案服务/b2b平台免费推广网站
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
示例 1:
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
示例 2:
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。
提示:
1 <= nums.length <= 105
nums[i] 不是 0 就是 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/A1NYOS
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目中需要求 0 和 1 个数的子数组相同,我们可以先把 0 转换成 -1,那么,如果子数组的和是 0,说明包含相同个数的 0 和 1,还是使用 map 进行查找,如果前 i 个数字和是 m,前 j 个数字和也是 m,说明 j - i 的这个长度的子数组之和是 0,一样的套路求出不一样的题目。
样例:
比如数组:1 1 1 1 0 0
初始化 map 是 (0, -1)
相加完 4 个 1 变成 (0,-1)(1,0)(2,1)(3,2)(4,3)意思是到了第三个位置的和是 4,接下来遇到 0
sum 变成 3,此时更新 maxLength = 4 - 2 = 2
再遇到 0,sum 变成 2,此时更新 = 5 - 1 = 4;
最后的答案就是 4。
class Solution {public int findMaxLength(int[] nums) {Map<Integer, Integer> map = new HashMap<>();int maxLength = 0, sum = 0;map.put(0, -1);for (int i = 0; i < nums.length; i++) {sum += nums[i] == 0 ? -1 : 1;if (map.containsKey(sum)) {maxLength = Math.max(maxLength, i - map.get(sum));} else {map.put(sum, i);}}return maxLength;}
}