可正 负 0 的数组,给定一个正整数k
求arr 所有子数组中累加和为k的最长子数组问题
s(i) 代表前i个元素的和,那么子数组arr[i.....j]的累加和为 s(i)-s(j-1) 这是题目的核心!!!
这样原问题解法,只遍历一遍。
设置map key表示此处的sum值 value表示出现的最早位置
从左到右开始遍历
如果当前便利到sum 则需要找到 sum-k 的位置 sum-(sum-k)即 和为k
注意啊 在设计哈希表时候 (0, -1)要设计上!! 要不就惨了!
package TT; import java.util.HashMap; public class Test71 { public static int maxLength(int[] arr, int k){ if(arr==null || arr.length==0){ return 0; } HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); map.put(0, -1); int len = 0; int sum = 0; for(int i =0; i<arr.length; i++){ sum +=arr[i]; if(map.containsKey(sum-k)){ len = Math.max(i-map.get(sum-k), len); } if (map.containsKey(sum)) { map.put(sum, i); } } return len; } }
进阶题目及其分析:
补充1 无序 可 正 负 0 ,求arr中所有子数组中 正数 与 负数 个数相等的最长子数组长度
补充2 无序 元素只是 0 或1 求子数组中 0和1 个数相等的最长子数组长度
思路1 把整数 设置为1 负数设置为2 求累加和为0的最长子数组
思路2 把0变成-1 1不变,求累加和为0的最长子数组