原题
https://leetcode-cn.com/problems/contiguous-array/
思路
1
不变,把0
变成-1
,求和为0
的最大长度
前缀和 + hash
题解
package com.leetcode.code;
import java.util.HashMap;
import java.util.Map;
/**
* @Description:
* @ClassName: Code525
* @Author: ZK
* @Date: 2021/6/3 15:00
* @Version: 1.0
*/
public class Code525 {
public static void main(String[] args) {
int[] nums = {0,1,1,0,1,1,1,0};
int res = findMaxLength(nums);
System.out.println(res);
}
public static int findMaxLength(int[] nums) {
int len = nums.length;
// 将原始数组中的 0 变成 -1,记录到一个 newNums 数组中
int[] newNums = new int[len];
for (int i = 0; i < len; i++) {
newNums[i] = nums[i]==1 ? 1 : -1;
}
// 求出 newNums 的前缀和
int[] sum = new int[len];
sum[0] = newNums[0];
for (int i = 1; i < len; i++) {
sum[i] = sum[i-1] + newNums[i];
}
// 此处添加三行打印,更加利于下面思路的清晰
show(nums);
show(newNums);
show(sum);
// 通过前缀和 + hash 求出 max
int max = 0;
// map-key: val 当前前缀和数组中的元素
// map-val: idx 对应的下标
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < len; i++) {
// val : 当前前缀和数组中的元素
int val = sum[i];
// idx : 对应的下标
int idx = i;
if (val == 0) {
max = Math.max(max, idx+1);
continue;
}
if (map.containsKey(val)) {
max = Math.max(max, idx - map.get(val));
} else {
map.put(val, idx);
}
}
return max;
}
public static void show(int[] nums){
for (int num : nums) {
System.out.print(num + "\t");
}
System.out.println();
}
}