package array; import java.util.HashMap; import java.util.Map; /** * Created by gouthamvidyapradhan on 03/01/2018. * Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum * equals to k. Example 1: Input:nums = [1,1,1], k = 2 Output: 2 Note: The length of the array is in range [1, 20,000]. The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7]. Solution: O(n) Maintain a hash-map of prefix sum and its count and check for range sum for each element. */ public class SubarraySumEqualsK { /** * Main method * @param args * @throws Exception */ public static void main(String[] args) throws Exception{ int[] A = {1, 2, 1, -2, 3, -1, -1}; System.out.println(new SubarraySumEqualsK().subarraySum(A, 2)); } public int subarraySum(int[] nums, int k) { Map map = new HashMap<>(); int sum = 0; for(int i : nums){ sum += i; Integer count = map.get(sum); if(count == null){ map.put(sum, 1); } else{ map.put(sum, count + 1); } } sum = 0; int result = 0; for(int i : nums){ int key = sum + k; if(map.containsKey(key)){ int count = map.get(key); result += count; } sum += i; if(map.containsKey(sum)){ int count = map.get(sum); if(count - 1 > 0){ map.put(sum, count - 1); } else{ map.remove(sum); } } } return result; } }