• 算法总结之 未排序数组中累加和为给定值的最长子数组系列问题


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

  • 相关阅读:
    原型设计
    案例分析
    编程作业
    《构建之法》阅读任务
    2021.3.11 准备工作随笔
    课程总结
    第十四周课程总结&实验报告(简单记事本的实现)
    第十三周课程总结
    第十二周
    第十一周课程总结
  • 原文地址:https://www.cnblogs.com/toov5/p/7489430.html
Copyright © 2020-2023  润新知