算法32.0
525. 连续数组 - 力扣(LeetCode)
和为k的子数组变种
自己的理解:
想着把0元素变成-1 这样就不能用滑动窗口 因为有负数 单调性不敢保证
暴力解法:先遍历一遍数组 把0元素从0变为-1 然后遍历所有前缀和情况 返回前缀和是0的情况 并对比出最长子数组的长度
优化暴力解法:如何快速查找前缀和为0的情况?

哈希表中存什么?
之前做和为k的子数组的时候 我们哈希表统计的是前缀和和出现的次数 这里我们需要统计最长子数组的长度,并不关心前缀和出现的次数
什么时候存入哈希表?
使用完之后,丢进哈希表
如果有重复的<sum,i> 如何存?
不需要 题目要的是最长的 重复的i和sum
只保留前面的那一对<sum,i> 这个时候是最长的
默认的前缀和为0的情况如何存?

也是有个默认的前缀和为0 但是此时前缀和要存的是下标
长度怎么算?

从i到j 就是i-j+1
但是实际长度不包含j点 所以就是i-j+1 -1 = i-j
细节:
审题:二进制数组就是元素仅为0或1的数组
别人的讲解:
直接统计0和1的数目
稍微转化一下 题目就会变得非常简单
将所有的0修改成-1 在数组中,找出最长的子数组,使子数组中所有元素的和为0
之前做过一道题:和为k的子数组 前缀和+哈希表
下面是题目、效果图和代码:


class Solution
{public int findMaxLength(int[] nums) {Map<Integer,Integer> hash = new HashMap<Integer,Integer>();hash.put(0,-1);//默认存在一个前缀和为0的情况int sum = 0,ret = 0;for(int i = 0 ;i<nums.length;i++){sum += (nums[i] == 0? -1 :1);//计算当前位置的前缀和 if(hash.containsKey(sum)) ret = Math.max(ret,i-hash.get(sum));else hash.put(sum,i);}return ret ; }
}
//xiyu251111&1#4*7
