maximum subarray whose sum equals 0

后端 未结 12 1377
礼貌的吻别
礼貌的吻别 2020-12-04 08:14

An array contains both positive and negative elements, find the maximum subarray whose sum equals 0.

12条回答
  •  生来不讨喜
    2020-12-04 08:49

    Below codes can find out every possible sub-array that has a sum being a given number, and (of course) it can find out the shortest and longest sub-array of that kind.

    public static void findGivenSumSubarray(int arr[], int givenSum) {
        int sum = 0;
        int sStart = 0, sEnd = Integer.MAX_VALUE - 1;  // Start & end position of the shortest sub-array
        int lStart = Integer.MAX_VALUE - 1, lEnd = 0;  // Start & end position of the longest  sub-array
    
        HashMap> sums = new HashMap<>();
        ArrayList indices = new ArrayList<>();
    
        indices.add(-1);
        sums.put(0, indices);
    
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            indices = sums.get(sum - givenSum);
            if(indices != null) {
                for(int index : indices) {
                    System.out.println("From #" + (index + 1) + " to #" + i);
                }
                if(i - indices.get(indices.size() - 1) < (sEnd - sStart + 1)) {
                    sStart = indices.get(indices.size() - 1) + 1;
                    sEnd = i;
                }
                if(i - indices.get(0) > (lEnd - lStart + 1)) {
                    lStart = indices.get(0) + 1;
                    lEnd = i;
                }
            }
            indices = sums.get(sum);
            if(indices == null) {
                indices = new ArrayList<>();
            }
            indices.add(i);
            sums.put(sum, indices);
        }
    
        System.out.println("Shortest sub-arry: Length = " + (sEnd - sStart + 1) + ", [" + sStart + " - " + sEnd + "]");
        System.out.println("Longest  sub-arry: Length = " + (lEnd - lStart + 1) + ", [" + lStart + " - " + lEnd + "]");
    }
    

提交回复
热议问题