Given an unsorted array of integers, find a subarray that adds to a given number. If there is more than one subarray with the sum of the given number, print any of them.
Examples:
Input: arr[] = {1, 4, 20, 3, 10, 5}, sum = 33
Output: Sum found between indexes 2 and 4
Explanation: Sum of elements between indices
2 and 4 is 20 + 3 + 10 = 33
Input: arr[] = {10, 2, -2, -20, 10}, sum = -10
Output: Sum found between indexes 0 to 3
Explanation: Sum of elements between indices
0 and 3 is 10 + 2 – 2 – 20 = -10
Input: arr[] = {-10, 0, 2, -2, -20, 10}, sum = 20
Output: No subarray with given sum exists
Explanation: There is no subarray with the given sum
Note: We have discussed a solution that does not handle negative integers here. In this post, negative integers are also handled.
Naive Approach: To solve the problem follow the below idea:
A simple solution is to consider all subarrays one by one and check the sum of every subarray. The following program implements the simple solution. Run two loops: the outer loop picks a starting point I and the inner loop tries all subarrays starting from i.
Follow the given steps to solve the problem:
- Traverse the array from start to end.
- From every index start another loop from i to the end of the array to get all subarrays starting from i, and keep a variable sum to calculate the sum. For every index in the inner loop update sum = sum + array[j]If the sum is equal to the given sum then print the subarray.
- For every index in the inner loop update sum = sum + array[j]
- If the sum is equal to the given sum then print the subarray.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int subArraySum( int arr[], int n, int sum)
{
int curr_sum, i, j;
for (i = 0; i < n; i++) {
curr_sum = 0;
for (j = i; j < n; j++) {
curr_sum = curr_sum + arr[j];
if (curr_sum == sum) {
cout << "Sum found between indexes " << i
<< " and " << j;
return 1;
}
}
}
cout << "No subarray found" ;
return 0;
}
int main()
{
int arr[] = { 15, 2, 4, 8, 9, 5, 10, 23 };
int n = sizeof (arr) / sizeof (arr[0]);
int sum = 23;
subArraySum(arr, n, sum);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int subArraySum( int arr[], int n, int sum)
{
int curr_sum, i, j;
for (i = 0 ; i < n; i++) {
curr_sum = 0 ;
for (j = i; j < n; j++) {
curr_sum = curr_sum + arr[j];
if (curr_sum == sum) {
System.out.print(
"Sum found between indexes " + i
+ " and " + j);
return 1 ;
}
}
}
System.out.print( "No subarray found" );
return 0 ;
}
public static void main(String[] args)
{
int arr[] = { 15 , 2 , 4 , 8 , 9 , 5 , 10 , 23 };
int n = arr.length;
int sum = 23 ;
subArraySum(arr, n, sum);
}
}
|
Python3
def subArraySum(arr, n, sum ):
for i in range (n):
curr_sum = 0
for j in range (i, n):
curr_sum + = arr[j]
if (curr_sum = = sum ):
print ( "Sum found between indexes" , i, "and" , j)
return
print ( "No subarray found" )
if __name__ = = "__main__" :
arr = [ 15 , 2 , 4 , 8 , 9 , 5 , 10 , 23 ]
n = len (arr)
sum = 23
subArraySum(arr, n, sum )
|
C#
using System;
public static class GFG {
public static int subArraySum( int [] arr, int n, int sum)
{
int curr_sum;
int i;
int j;
for (i = 0; i < n; i++) {
curr_sum = 0;
for (j = i; j < n; j++) {
curr_sum = curr_sum + arr[j];
if (curr_sum == sum) {
Console.Write(
"Sum found between indexes " );
Console.Write(i);
Console.Write( " and " );
Console.Write(j);
return 1;
}
}
}
Console.Write( "No subarray found" );
return 0;
}
public static void Main()
{
int [] arr = { 15, 2, 4, 8, 9, 5, 10, 23 };
int n = arr.Length;
int sum = 23;
subArraySum(arr, n, sum);
}
}
|
Javascript
function subArraySum(arr, n, sum)
{
var curr_sum, i, j;
for (i = 0; i < n; i++) {
curr_sum = 0;
for (j = i ; j < n; j++) {
curr_sum = curr_sum + arr[j];
if (curr_sum == sum) {
console.log( "Sum found between indexes " + i + " and " + j);
return ;
}
}
}
console.log( "No subarray found" );
}
var arr = [ 15, 2, 4, 8, 9, 5, 10, 23 ];
var n = arr.length;
var sum = 23;
subArraySum(arr, n, sum);
|
Output
Sum found between indexes 1 and 4
Time Complexity: O(N2)
Auxiliary Space: O(1)
Find subarray with given sum using Hash-Map:
To solve the problem follow the below idea:
The idea is to store the sum of elements of every prefix of the array in a hashmap, i.e, every index stores the sum of elements up to that index hashmap. So to check if there is a subarray with a sum equal to s, check for every index i, and sum up to that index as x. If there is a prefix with a sum equal to (x – s), then the subarray with the given sum is found
Follow the given steps to solve the problem:
- Create a Hashmap (hm) to store a key-value pair, i.e, key = prefix sum and value = its index, and a variable to store the current sum (sum = 0) and the sum of the subarray as s
- Traverse through the array from start to end.
- For every element update the sum, i.e sum = sum + array[i]
- If the sum is equal to s then print that the subarray with the given sum is from 0 to i
- If there is any key in the HashMap which is equal to sum – s then print that the subarray with the given sum is from hm[sum – s] to i
- Put the sum and index in the hashmap as a key-value pair.
Dry-run of the above approach:

Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void subArraySum( int arr[], int n, int sum)
{
unordered_map< int , int > map;
int curr_sum = 0;
for ( int i = 0; i < n; i++) {
curr_sum = curr_sum + arr[i];
if (curr_sum == sum) {
cout << "Sum found between indexes " << 0
<< " to " << i << endl;
return ;
}
if (map.find(curr_sum - sum) != map.end()) {
cout << "Sum found between indexes "
<< map[curr_sum - sum] + 1 << " to " << i
<< endl;
return ;
}
map[curr_sum] = i;
}
cout << "No subarray with given sum exists" ;
}
int main()
{
int arr[] = { 10, 2, -2, -20, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
int sum = -10;
subArraySum(arr, n, sum);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static void subArraySum( int [] arr, int n,
int sum)
{
int cur_sum = 0 ;
int start = 0 ;
int end = - 1 ;
HashMap<Integer, Integer> hashMap = new HashMap<>();
for ( int i = 0 ; i < n; i++) {
cur_sum = cur_sum + arr[i];
if (cur_sum - sum == 0 ) {
start = 0 ;
end = i;
break ;
}
if (hashMap.containsKey(cur_sum - sum)) {
start = hashMap.get(cur_sum - sum) + 1 ;
end = i;
break ;
}
hashMap.put(cur_sum, i);
}
if (end == - 1 ) {
System.out.println(
"No subarray with given sum exists" );
}
else {
System.out.println( "Sum found between indexes "
+ start + " to " + end);
}
}
public static void main(String[] args)
{
int [] arr = { 10 , 2 , - 2 , - 20 , 10 };
int n = arr.length;
int sum = - 10 ;
subArraySum(arr, n, sum);
}
}
|
Python3
def subArraySum(arr, n, Sum ):
Map = {}
curr_sum = 0
for i in range ( 0 , n):
curr_sum = curr_sum + arr[i]
if curr_sum = = Sum :
print ( "Sum found between indexes 0 to" , i)
return
if (curr_sum - Sum ) in Map :
print ( "Sum found between indexes" ,
Map [curr_sum - Sum ] + 1 , "to" , i)
return
Map [curr_sum] = i
print ( "No subarray with given sum exists" )
if __name__ = = "__main__" :
arr = [ 10 , 2 , - 2 , - 20 , 10 ]
n = len (arr)
Sum = - 10
subArraySum(arr, n, Sum )
|
C#
using System;
using System.Collections.Generic;
public class GFG {
public static void subArraySum( int [] arr, int n,
int sum)
{
int cur_sum = 0;
int start = 0;
int end = -1;
Dictionary< int , int > hashMap
= new Dictionary< int , int >();
for ( int i = 0; i < n; i++) {
cur_sum = cur_sum + arr[i];
if (cur_sum - sum == 0) {
start = 0;
end = i;
break ;
}
if (hashMap.ContainsKey(cur_sum - sum)) {
start = hashMap[cur_sum - sum] + 1;
end = i;
break ;
}
hashMap[cur_sum] = i;
}
if (end == -1) {
Console.WriteLine(
"No subarray with given sum exists" );
}
else {
Console.WriteLine( "Sum found between indexes "
+ start + " to " + end);
}
}
public static void Main( string [] args)
{
int [] arr = new int [] { 10, 2, -2, -20, 10 };
int n = arr.Length;
int sum = -10;
subArraySum(arr, n, sum);
}
}
|
Javascript
function subArraySum(arr, n, sum) {
let cur_sum = 0;
let start = 0;
let end = -1;
let hashMap = new Map();
for (let i = 0; i < n; i++) {
cur_sum = cur_sum + arr[i];
if (cur_sum - sum == 0) {
start = 0;
end = i;
break ;
}
if (hashMap.has(cur_sum - sum)) {
start = hashMap.get(cur_sum - sum) + 1;
end = i;
break ;
}
hashMap.set(cur_sum, i);
}
if (end == -1) {
console.log( "No subarray with given sum exists" );
}
else {
console.log( "Sum found between indexes "
+ start + " to " + end);
}
}
let arr = [10, 2, -2, -20, 10];
let n = arr.length;
let sum = -10;
subArraySum(arr, n, sum);
|
Output
Sum found between indexes 0 to 3
Time complexity: O(N). If hashing is performed with the help of an array, then this is the time complexity. In case the elements cannot be hashed in an array a hash map can also be used as shown in the above code.
Auxiliary space: O(N). As a HashMap is needed, this takes linear space.
Related Article: Find subarray with given sum with negatives allowed in constant space
If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
20 Sep, 2022
Like Article
Save Article