# Python Program For Finding Subarray With Given Sum – Set 1 (Nonnegative Numbers)

Given an unsorted array of nonnegative integers, find a continuous subarray which adds to a given number. **Examples :**

Input: arr[] = {1, 4, 20, 3, 10, 5}, sum = 33Output: Sum found between indexes 2 and 4 Sum of elements between indices 2 and 4 is 20 + 3 + 10 = 33Input: arr[] = {1, 4, 0, 0, 3, 10, 5}, sum = 7Output: Sum found between indexes 1 and 4 Sum of elements between indices 1 and 4 is 4 + 0 + 0 + 3 = 7Input: arr[] = {1, 4}, sum = 0Output: No subarray found There is no subarray with 0 sum

There may be more than one subarrays with sum as the given sum. The following solutions print first such subarray.

** Simple Approach:** A simple solution is to consider all subarrays one by one and check the sum of every subarray. 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.

**Algorithm:**

- Traverse the array from start to end.
- From every index start another loop from
*i*to the end of array to get all subarray starting from i, keep a variable sum to calculate the sum. - For every index in inner loop update
*sum = sum + array[j]* - If the sum is equal to the given sum then print the subarray.

## Python3

`# Python program to implement` `# the above approach` `# 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` `(n):` ` ` `curr_sum ` `=` `arr[i]` ` ` ` ` `# Try all subarrays starting ` ` ` `# with 'i'` ` ` `j ` `=` `i ` `+` `1` ` ` `while` `j <` `=` `n: ` ` ` `if` `curr_sum ` `=` `=` `sum_:` ` ` `print` `(` `"Sum found between"` `)` ` ` `print` `(` `"indexes % d and % d"` `%` `( i, j` `-` `1` `)) ` ` ` `return` `1` ` ` ` ` `if` `curr_sum > sum_ ` `or` `j ` `=` `=` `n:` ` ` `break` ` ` ` ` `curr_sum ` `=` `curr_sum ` `+` `arr[j]` ` ` `j ` `+` `=` `1` ` ` ` ` `print` `(` `"No subarray found"` `)` ` ` `return` `0` ` ` `# Driver code` `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.` |

**Output :**

Sum found between indexes 1 and 4

**Complexity Analysis:**

**Time Complexity:**O(n^2) in worst case.

Nested loop is used to traverse the array so the time complexity is O(n^2)**Space Complexity:**O(1).

As constant extra space is required.

** Efficient Approach:** There is an idea if all the elements of the array are positive. If a subarray has sum greater than the given sum then there is no possibility that adding elements to the current subarray the sum will be

*x*(given sum). 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*. If the sum is greater than

*x*, remove elements from the start of the current subarray.

**Algorithm:**

- Create three variables,
*l=0, sum = 0* - Traverse the array from start to end.
- Update the variable sum by adding current element,
*sum = sum + array[i]* - If the sum is greater than the given sum, update the variable sum as
*sum = sum – array[l]*, and update l as, l++. - If the sum is equal to given sum, print the subarray and break the loop.

## 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 curr_sum as value of ` ` ` `# first element and starting point ` ` ` `# as 0 ` ` ` `curr_sum ` `=` `arr[` `0` `]` ` ` `start ` `=` `0` ` ` ` ` `# Add elements one by one to curr_sum ` ` ` `# and if the curr_sum exceeds the sum, ` ` ` `# then remove starting element ` ` ` `i ` `=` `1` ` ` `while` `i <` `=` `n:` ` ` ` ` `# If curr_sum exceeds the sum, ` ` ` `# then remove the starting elements` ` ` `while` `curr_sum > sum_ ` `and` `start < i` `-` `1` `:` ` ` ` ` `curr_sum ` `=` `curr_sum ` `-` `arr[start]` ` ` `start ` `+` `=` `1` ` ` ` ` `# If curr_sum becomes equal to sum, ` ` ` `# then return true` ` ` `if` `curr_sum ` `=` `=` `sum_:` ` ` `print` `(` `"Sum found between indexes"` `)` ` ` `print` `(` `"% d and % d"` `%` `(start, i` `-` `1` `))` ` ` `return` `1` ` ` ` ` `# Add this element to curr_sum` ` ` `if` `i < n:` ` ` `curr_sum ` `=` `curr_sum ` `+` `arr[i]` ` ` `i ` `+` `=` `1` ` ` ` ` `# If we reach here, then no subarray` ` ` `print` `(` `"No subarray found"` `)` ` ` `return` `0` ` ` `# Driver code` `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.` |

**Output :**

Sum found between indexes 1 and 4

**Complexity Analysis:**

**Time Complexity :**O(n).

Only one traversal of the array is required. So the time complexity is O(n).**Space Complexity:**O(1).

As constant extra space is required.

Please refer complete article on Find subarray with given sum | Set 1 (Nonnegative Numbers) for more details!