可正 负 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的最长子数组