Skip to content
Related Articles

Related Articles

Find Subarray with given sum | Set 1 (Non-negative Numbers)

Improve Article
Save Article
  • Difficulty Level : Medium
  • Last Updated : 15 Nov, 2022
Improve Article
Save Article

Given an array arr[] of non-negative integers and an integer sum, find a subarray that adds to a given sum.

Note: There may be more than one subarray with sum as the given sum, print first such subarray. 

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[] = {1, 4, 0, 0, 3, 10, 5}, sum = 7
Output: Sum found between indexes 1 and 4
Explanation: Sum of elements between indices 1 and 4 is 4 + 0 + 0 + 3 = 7

Input: arr[] = {1, 4}, sum = 0
Output: No subarray found
Explanation: There is no subarray with 0 sum

Recommended Practice

Find subarray with given sum using Nested loop

The idea is to consider all subarrays one by one and check the sum of every subarray. Following program implements the given idea. 
Run two loops: the outer loop picks a starting point i and the inner loop tries all subarrays starting from i.

Follow the steps given below to implement the approach:

  • 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 currentSum to calculate the sum of every subarray.
  • For every index in inner loop update currentSum = currentSum + arr[j]
  • If the currentSum is equal to the given sum then print the subarray.

 Below is the implementation of the above approach.

C++




/* A simple program to print subarray
with sum as given sum */
#include <bits/stdc++.h>
using namespace std;
 
/* Returns true if the there is a subarray
of arr[] with sum equal to 'sum' otherwise
returns false. Also, prints the result */
void subArraySum(int arr[], int n, int sum)
{
 
    // Pick a starting point
    for (int i = 0; i < n; i++) {
        int currentSum = arr[i];
 
        if (currentSum == sum) {
            cout << "Sum found at indexes " << i << endl;
            return;
        }
        else {
            // Try all subarrays starting with 'i'
            for (int j = i + 1; j < n; j++) {
                currentSum += arr[j];
 
                if (currentSum == sum) {
                    cout << "Sum found between indexes "
                         << i << " and " << j << endl;
                    return;
                }
            }
        }
    }
    cout << "No subarray found";
    return;
}
 
// Driver Code
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;
}
 
// This code is contributed
// by rathbhupendra

C




/* A simple program to print
subarray with sum as given sum */
#include <stdio.h>
 
/* Returns true if the there is a subarray
of arr[] with a sum equal to 'sum'
   otherwise returns false.  Also, prints
the result */
void subArraySum(int arr[], int n, int sum)
{
    // Pick a starting point
    for (int i = 0; i < n; i++) {
        int currentSum = arr[i];
 
        if (currentSum == sum) {
            printf("Sum found at indexe %d ", i);
            return;
        }
        else {
            // Try all subarrays starting with 'i'
            for (int j = i + 1; j < n; j++) {
                currentSum += arr[j];
 
                if (currentSum == sum) {
                    printf("Sum found between indexes %d "
                           "and %d",
                           i, j);
                    return;
                }
            }
        }
    }
    printf("No subarray found");
    return;
}
 
// Driver program to test above function
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




public class SubarraySum {
    /* Returns true if the there is a
subarray of arr[] with a sum equal to
       'sum' otherwise returns false.
Also, prints the result */
    void subArraySum(int arr[], int n, int sum)
    {
        // Pick a starting point
        for (int i = 0; i < n; i++) {
            int currentSum = arr[i];
 
            if (currentSum == sum) {
                System.out.println("Sum found at indexe "
                                   + i);
                return;
            }
            else {
                // Try all subarrays starting with 'i'
                for (int j = i + 1; j < n; j++) {
                    currentSum += arr[j];
 
                    if (currentSum == sum) {
                        System.out.println(
                            "Sum found between indexes " + i
                            + " and " + j);
                        return;
                    }
                }
            }
        }
        System.out.println("No subarray found");
        return;
    }
 
    public static void main(String[] args)
    {
        SubarraySum arraysum = new SubarraySum();
        int arr[] = { 15, 2, 4, 8, 9, 5, 10, 23 };
        int n = arr.length;
        int sum = 23;
        arraysum.subArraySum(arr, n, sum);
    }
}
 
// This code has been contributed by Mayank
// Jaiswal(mayank_24)

Python3




# A simple program to print subarray with sum as given sum
 
# Returns true if the there is a subarray of arr[] with sum equal to 'sum' otherwise returns false. Also, prints the result
def subArraySum(arr, n, sum):
 
    # Pick a starting point
    for i in range(0,n):
        currentSum = arr[i]
        if(currentSum == sum):
            print("Sum found at indexes",i)
            return
        else:
            # Try all subarrays starting with 'i'
            for j in range(i+1,n):
                currentSum += arr[i]
                if(currentSum == sum):
                    print("Sum found between indexes",i,"and",j)
                    return
    print("No Subarray Found")
 
# Driver Code
if __name__ == "__main__":
    arr = [15,2,4,8,9,5,10,23]
    n = len(arr)
    sum = 23
    subArraySum(arr, n, sum)
     
    # This code is contributed by ajaymakvana

C#




using System;
 
public class HelloWorld
{
   
    /* Returns true if the there is a subarray of arr[] with a sum equal to
       'sum' otherwise returns false. Also, prints the result */
    public static void subArraySum(int[] arr, int n, int sum)
    {
       
        // Pick a starting point
        for (int i = 0; i < n; i++) {
            int currentSum = arr[i];
 
            if (currentSum == sum) {
                Console.WriteLine("Sum found at indexe " + i);
                return;
            } else
            {
               
                // Try all subarrays starting with 'i'
                for (int j = i + 1; j < n; j++) {
                    currentSum += arr[j];
 
                    if (currentSum == sum) {
                        Console.WriteLine("Sum found between indexes " + i + " and " + j);
                        return;
                    }
                }
            }
        }
        Console.WriteLine("No subarray found");
        return;
    }
 
    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);
    }
}
 
// This code is contributed by ajaymakavana.

Javascript




/* A simple program to print subarray
with sum as given sum */
 
/* Returns true if the there is a subarray
of arr[] with sum equal to 'sum' otherwise
returns false. Also, prints the result */
function subArraySum( arr,  n,  sum)
{
 
    // Pick a starting point
    for (let i = 0; i < n; i++) {
        let currentSum = arr[i];
 
        if (currentSum == sum) {
            console.log("Sum found at indexes " +i);
            return;
        }
        else {
            // Try all subarrays starting with 'i'
            for (let j = i + 1; j < n; j++) {
                currentSum += arr[j];
 
                if (currentSum == sum) {
                    console.log("Sum found between indexes "
                         + i + " and " +j);
                    return;
                }
            }
        }
    }
    console.log("No subarray found");
    return;
}
 
    let arr = [15, 2, 4, 8, 9, 5, 10, 23 ];
    let n = arr.length;
    let sum = 23;
    subArraySum(arr, n, sum);
 
// This code is contributed by garg28harsh.

Output

Sum found between indexes 1 and 4

Time Complexity: O(N2), Trying all subarrays from every index, used nested loop for the same
Auxiliary Space: O(1). 

Find subarray with given sum using Sliding Window

The idea is simple as we know that all the elements in subarray are positive so, If a subarray has sum greater than the given sum then there is no possibility that adding elements to the current subarray will be equal to the given sum. So the Idea is to use a similar approach to a sliding window

  • Start with an empty subarray 
  • add elements to the subarray until the sum is less than x( given sum )
  • If the sum is greater than x, remove elements from the start of the current subarray.

Follow the steps given below to implement the approach:

  • Create two variables, start=0, currentSum = arr[0]
  • Traverse the array from index 1 to end.
  • Update the variable currentSum by adding current element, currentSum = currentSum + arr[i]
  • If the currentSum is greater than the given sum, update the variable currentSum as currentSum = currentSum – arr[start],
    and update start as, start++.
  • If the currentSum is equal to given sum, print the subarray and break the loop.

 Below is the implementation of the above approach.

C++




/* An efficient program to print
subarray with sum as given sum */
#include <iostream>
using namespace std;
 
/* Returns true if the there is a subarray of
arr[] with a sum equal to 'sum' otherwise
returns false. Also, prints the result */
int subArraySum(int arr[], int n, int sum)
{
    /* Initialize currentSum as value of
    first element and starting point as 0 */
    int currentSum = arr[0], start = 0, i;
 
    /* Add elements one by one to currentSum and
    if the currentSum exceeds the sum,
    then remove starting element */
    for (i = 1; i <= n; i++) {
        // If currentSum exceeds the sum,
        // then remove the starting elements
        while (currentSum > sum && start < i - 1) {
            currentSum = currentSum - arr[start];
            start++;
        }
 
        // If currentSum becomes equal to sum,
        // then return true
        if (currentSum == sum) {
            cout << "Sum found between indexes " << start
                 << " and " << i - 1;
            return 1;
        }
 
        // Add this element to currentSum
        if (i < n)
            currentSum = currentSum + arr[i];
    }
 
    // If we reach here, then no subarray
    cout << "No subarray found";
    return 0;
}
 
// Driver Code
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;
}
 
// This code is contributed by SHUBHAMSINGH10

C




/* An efficient program to print
subarray with sum as given sum */
#include <stdio.h>
 
/* Returns true if the there is a
subarray of arr[] with a sum
equal to 'sum' otherwise returns
false.  Also, prints the result */
int subArraySum(int arr[], int n, int sum)
{
    /* Initialize currentSum as
       value of first element and
starting point as 0 */
    int currentSum = arr[0], start = 0, i;
 
    /* Add elements one by one to
currentSum and if the currentSum
       exceeds the sum, then remove
starting element */
    for (i = 1; i <= n; i++) {
        // If currentSum exceeds the sum,
        // then remove the starting elements
        while (currentSum > sum && start < i - 1) {
            currentSum = currentSum - arr[start];
            start++;
        }
 
        // If currentSum becomes equal to sum,
        // then return true
        if (currentSum == sum) {
            printf("Sum found between indexes %d and %d",
                   start, i - 1);
            return 1;
        }
 
        // Add this element to currentSum
        if (i < n)
            currentSum = currentSum + arr[i];
    }
 
    // If we reach here, then no subarray
    printf("No subarray found");
    return 0;
}
 
// Driver program to test above function
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




public class SubarraySum {
    /* Returns true if the there is
a subarray of arr[] with sum equal to
       'sum' otherwise returns false.
Also, prints the result */
    int subArraySum(int arr[], int n, int sum)
    {
        int currentSum = arr[0], start = 0, i;
 
        // Pick a starting point
        for (i = 1; i <= n; i++) {
            // If currentSum exceeds the sum,
            // then remove the starting elements
            while (currentSum > sum && start < i - 1) {
                currentSum = currentSum - arr[start];
                start++;
            }
 
            // If currentSum becomes equal to sum,
            // then return true
            if (currentSum == sum) {
                int p = i - 1;
                System.out.println(
                    "Sum found between indexes " + start
                    + " and " + p);
                return 1;
            }
 
            // Add this element to curr_sum
            if (i < n)
                currentSum = currentSum + arr[i];
        }
 
        System.out.println("No subarray found");
        return 0;
    }
 
    public static void main(String[] args)
    {
        SubarraySum arraysum = new SubarraySum();
        int arr[] = { 15, 2, 4, 8, 9, 5, 10, 23 };
        int n = arr.length;
        int sum = 23;
        arraysum.subArraySum(arr, n, sum);
    }
}
 
// This code has been contributed by Mayank
// Jaiswal(mayank_24)

Python3




# An efficient program
# to print subarray
# with sum as given sum
 
# Returns true if the
# there is a subarray
# of arr[] with sum
# equal to 'sum'
# otherwise returns
# false. Also, prints
# the result.
 
 
def subArraySum(arr, n, sum_):
 
    # Initialize currentSum as
    # value of first element
    # and starting point as 0
    currentSum = arr[0]
    start = 0
 
    # Add elements one by
    # one to currentSum and
    # if the currentSum exceeds
    # the sum, then remove
    # starting element
    i = 1
    while i <= n:
 
        # If currentSum exceeds
        # the sum, then remove
        # the starting elements
        while currentSum > sum_ and start < i-1:
 
            currentSum = currentSum - arr[start]
            start += 1
 
        # If currentSum becomes
        # equal to sum, then
        # return true
        if currentSum == sum_:
            print("Sum found between indexes % d and % d" % (start, i-1))
 
            return 1
 
        # Add this element
        # to currentSum
        if i < n:
            currentSum = currentSum + arr[i]
        i += 1
 
    # If we reach here,
    # then no subarray
    print("No subarray found")
    return 0
 
 
# Driver program
if __name__ == '__main__':
    arr = [15, 2, 4, 8, 9, 5, 10, 23]
    n = len(arr)
    sum_ = 23
 
subArraySum(arr, n, sum_)
 
# This code is Contributed by shreyanshi_arun.

C#




// An efficient C# program to print
// subarray with sum as given sum
using System;
 
class GFG {
 
    // Returns true if the
    // there is a subarray of
    // arr[] with sum equal to
    // 'sum' otherwise returns false.
    // Also, prints the result
    int subArraySum(int[] arr, int n, int sum)
    {
        int currentSum = arr[0], start = 0, i;
 
        // Pick a starting point
        for (i = 1; i <= n; i++) {
            // If currentSum exceeds
            // the sum, then remove
            // the starting elements
            while (currentSum > sum && start < i - 1) {
                currentSum = currentSum - arr[start];
                start++;
            }
 
            // If currentSum becomes equal to
            // sum, then return true
            if (currentSum == sum) {
                int p = i - 1;
                Console.WriteLine("Sum found between "
                                  + "indexes " + start
                                  + " and " + p);
                return 1;
            }
 
            // Add this element to currentSum
            if (i < n)
                currentSum = currentSum + arr[i];
        }
        Console.WriteLine("No subarray found");
        return 0;
    }
 
    // Driver code
    public static void Main()
    {
        GFG arraysum = new GFG();
        int[] arr = new int[] { 15, 2, 4, 8, 9, 5, 10, 23 };
        int n = arr.Length;
        int sum = 23;
        arraysum.subArraySum(arr, n, sum);
    }
}
 
// This code has been contributed by KRV.

PHP




<?php
/* An efficient program to print
subarray with sum as given sum */
 
/* Returns true if the there is a
subarray of arr[] with sum equal
to 'sum' otherwise returns false.
Also, prints the result */
function subArraySum($arr, $n, $sum)
{
    /* Initialize currentSum as
    value of first element
    and starting point as 0 */
    $currentSum = $arr[0];
    $start = 0; $i;
 
    /* Add elements one by one to
    currentSum and if the currentSum
    exceeds the sum, then remove
    starting element */
    for ($i = 1; $i <= $n; $i++)
    {
        // If currentSum exceeds the sum,
        // then remove the starting elements
        while ($currentSum > $sum and
               $start < $i - 1)
        {
            $currentSum = $currentSum -
                        $arr[$start];
            $start++;
        }
 
        // If currentSum becomes equal
        // to sum, then return true
        if ($currentSum == $sum)
        {
            echo "Sum found between indexes",
                             " ", $start, " ",
                           "and ", " ", $i - 1;
            return 1;
        }
 
        // Add this element
        // to currentSum
        if ($i < $n)
        $currentSum = $currentSum + $arr[$i];
    }
 
    // If we reach here,
    // then no subarray
    echo "No subarray found";
    return 0;
}
 
// Driver Code
$arr = array(15, 2, 4, 8,
              9, 5, 10, 23);
$n = count($arr);
$sum = 23;
subArraySum($arr, $n, $sum);
 
// This code has been
// contributed by anuj_67.
?>

Javascript




<script>
/* Returns true if the there is
a subarray of arr[] with sum equal to
       'sum' otherwise returns false.
Also, prints the result */
     
    function subArraySum(arr,n,sum)
    {
        let currentSum = arr[0], start = 0, i;
  
        // Pick a starting point
        for (i = 1; i <= n; i++) {
            // If currentSum exceeds the sum,
            // then remove the starting elements
            while (currentSum > sum && start < i - 1) {
                currentSum = currentSum - arr[start];
                start++;
            }
  
            // If currentSum becomes equal to sum,
            // then return true
            if (currentSum == sum) {
                let p = i - 1;
                document.write(
                    "Sum found between indexes " + start
                    + " and " + p+"<br>");
                return 1;
            }
  
            // Add this element to currentSum
            if (i < n)
                currentSum = currentSum + arr[i];
        }
  
        document.write("No subarray found");
        return 0;
    }
     
    let arr=[15, 2, 4, 8, 9, 5, 10, 23 ];
    let n = arr.length;
    let sum = 23;
    subArraySum(arr, n, sum);
     
    // This code is contributed by unknown2108
</script>

Output

Sum found between indexes 1 and 4

Time Complexity: O(N)
Auxiliary Space: O(1). Since no extra space has been taken.

 

Complete Interview Preparation - GFG

The above solution doesn’t handle negative numbers. We can use hashing to handle negative numbers. See below set 2.


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!