Given an input array find all subarrays with given sum K

前端 未结 9 1236
梦如初夏
梦如初夏 2020-12-23 10:03

Given an input array we can find a single sub-array which sums to K (given) in linear time, by keeping track of sum found so far and the start position. If the current sum b

9条回答
  •  情书的邮戳
    2020-12-23 10:43

    Solution as given by @Evgeny Kluev coded in Java with a little explanation.

    public static void main(String[] args) {
        int[] INPUT = {5, 6, 1, -2, -4, 3, 1, 5};
        printSubarrays(INPUT, 5);
    }
    
    private static void printSubarrays(int[] input, int k) {
        Map> map = new HashMap>();
        List initial = new ArrayList();
        initial.add(-1);
        map.put(0, initial);
        int preSum = 0;
    
        // Loop across all elements of the array
        for(int i=0; i< input.length; i++) {
            preSum += input[i];
            // If point where sum = (preSum - k) is present, it means that between that 
            // point and this, the sum has to equal k
            if(map.containsKey(preSum - k)) {   // Subarray found 
                List startIndices = map.get(preSum - k);
                for(int start : startIndices) {
                    System.out.println("Start: "+ (start+1)+ "\tEnd: "+ i);
                }
            }
    
            List newStart = new ArrayList();
            if(map.containsKey(preSum)) { 
                newStart = map.get(preSum);
            }
            newStart.add(i);
            map.put(preSum, newStart);
        }
    }
    

提交回复
热议问题