Given an array A[] consisting of N positive integers and an integer K, the task is to find the length of the smallest subarray with a sum greater than or equal to K. If no such subarray exists, print -1.
Examples:
Input: arr[] = {3, 1, 7, 1, 2}, K = 11
Output: 3
Explanation:
The smallest subarray with sum ? K(= 11) is {3, 1, 7}.Input: arr[] = {2, 3, 5, 4, 1}, K = 11
Output: 3
Explanation:
The minimum possible subarray is {3, 5, 4}.
Naive and Binary Search Approach: Refer to Smallest subarray from a given Array with sum greater than or equal to K for the simplest approach and the Binary Search based approaches to solve the problem.
Recursive Approach: The simplest approach to solve the problem is to use Recursion. Follow the steps below to solve the problem:
- If K ? 0: Print -1 as no such subarray can be obtained.
- If the sum of the array is equal to K, print the length of the array as the required answer.
- If the first element in the array is greater than K, then print 1 as the required answer.
- Otherwise, proceed to find the smallest subarray both by considering the current element in the subarray as well as not including it.
- Repeat the above steps for every element traversed.
Below is the implementation of the above approach:
C++14
// C++14 program for the above approach#include <bits/stdc++.h>using namespace std;Â
// Function to find the smallest subarray// sum greater than or equal to targetint smallSumSubset(vector<int> data,                   int target, int maxVal){    int sum = 0;Â
    for(int i : data)         sum += i;Â
    // Base Case    if (target <= 0)        return 0;Â
    // If sum of the array    // is less than target    else if (sum < target)        return maxVal;Â
    // If target is equal to    // the sum of the array    else if (sum == target)        return data.size();Â
    // Required condition    else if (data[0] >= target)        return 1;Â
    else if (data[0] < target)    {        vector<int> temp;        for(int i = 1; i < data.size(); i++)            temp.push_back(data[i]);                      return min(smallSumSubset(temp, target,                                   maxVal),                1 + smallSumSubset(temp, target -                                data[0], maxVal));    }}Â
// Driver Codeint main(){    vector<int> data = { 3, 1, 7, 1, 2 };    int target = 11;         int val = smallSumSubset(data, target,                             data.size() + 1);         if (val > data.size())        cout << -1;    else        cout << val;}    Â
// This code is contributed by mohit kumar 29 |
Java
// Java program for the above approachimport java.util.*;import java.lang.*;Â
class GFG{Â
// Function to find the smallest subarray // sum greater than or equal to target static int smallSumSubset(List<Integer> data, Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â int target, int maxVal) { Â Â Â Â int sum = 0; Â
    for(Integer i : data)         sum += i; Â
    // Base Case     if (target <= 0)         return 0; Â
    // If sum of the array     // is less than target     else if (sum < target)         return maxVal; Â
    // If target is equal to     // the sum of the array     else if (sum == target)         return data.size(); Â
    // Required condition     else if (data.get(0) >= target)         return 1; Â
    else if (data.get(0) < target)     {         List<Integer> temp = new ArrayList<>();         for(int i = 1; i < data.size(); i++)             temp.add(data.get(i));                      return Math.min(smallSumSubset(temp, target,                                              maxVal),                     1 + smallSumSubset(temp, target -                                 data.get(0), maxVal));     }     return -1;}      // Driver Codepublic static void main (String[] args){    List<Integer> data = Arrays.asList(3, 1, 7, 1, 2);     int target = 11;          int val = smallSumSubset(data, target,                              data.size() + 1);          if (val > data.size())         System.out.println(-1);     else        System.out.println(val); }}Â
// This code is contributed by offbeat |
Python3
# Python3 program for the above approachÂ
# Function to find the smallest subarray# sum greater than or equal to targetdef smallSumSubset(data, target, maxVal):Â Â Â Â # base conditionÂ
    # Base Case    if target <= 0:        return 0Â
    # If sum of the array    # is less than target    elif sum(data) < target:        return maxValÂ
    # If target is equal to    # the sum of the array    elif sum(data) == target:        return len(data)Â
    # Required condition    elif data[0] >= target:        return 1Â
    elif data[0] < target:        return min(smallSumSubset(data[1:], \        target, maxVal),                1 + smallSumSubset(data[1:], \                target-data[0], maxVal)) Â
Â
# Driver Codedata = [3, 1, 7, 1, 2]target = 11Â
val = smallSumSubset(data, target, len(data)+1)Â
if val > len(data):Â Â Â Â print(-1)else:Â Â Â Â print(val) |
C#
// C# program for the above approachusing System;using System.Collections.Generic;Â
class GFG{     // Function to find the smallest subarray // sum greater than or equal to target static int smallSumSubset(List<int> data,                    int target, int maxVal) {     int sum = 0;        foreach(int i in data)        sum += i;        // Base Case     if (target <= 0)         return 0;        // If sum of the array     // is less than target     else if (sum < target)         return maxVal;        // If target is equal to     // the sum of the array     else if (sum == target)         return data.Count;        // Required condition     else if (data[0] >= target)         return 1;        else if (data[0] < target)     {         List<int> temp = new List<int>();        for(int i = 1; i < data.Count; i++)             temp.Add(data[i]);                        return Math.Min(smallSumSubset(temp, target,                                        maxVal),                     1 + smallSumSubset(temp, target -                                     data[0], maxVal));     }     return 0;} Â
// Driver code static void Main(){    List<int> data = new List<int>();     data.Add(3);    data.Add(1);    data.Add(7);    data.Add(1);    data.Add(2);         int target = 11;            int val = smallSumSubset(data, target,                             data.Count + 1);            if (val > data.Count)         Console.Write(-1);    else        Console.Write(val);}}Â
// This code is contributed by divyeshrabadiya07 |
Javascript
<script>Â
// js program for the above approachÂ
// Function to find the smallest subarray// sum greater than or equal to targetfunction smallSumSubset(data, target, maxVal){Â Â Â Â let sum = 0;Â
    for(let i=0;i< data.length;i++)         sum += data[i];Â
    // Base Case    if (target <= 0)        return 0;Â
    // If sum of the array    // is less than target    else if (sum < target)        return maxVal;Â
    // If target is equal to    // the sum of the array    else if (sum == target)        return data.length;Â
    // Required condition    else if (data[0] >= target)        return 1;Â
    else if (data[0] < target)    {        let temp = [];        for(let i = 1; i < data.length; i++)            temp.push(data[i]);                      return Math.min(smallSumSubset(temp, target,                                   maxVal),                1 + smallSumSubset(temp, target -                                data[0], maxVal));    }}Â
// Driver Codelet data = [ 3, 1, 7, 1, 2 ];let target = 11;let val = smallSumSubset(data, target,                             data.length + 1);         if (val > data.length)        document.write( -1);    else        document.write(val);  </script> |
3
Time Complexity: O(2N)
Auxiliary Space: O(N)
Efficient Approach: The above approach can be optimized using Dynamic programming by memorizing the subproblems to avoid re-computation.
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include<bits/stdc++.h>using namespace std;     // Function to find the smallest subarray// with sum greater than or equal targetint minlt(vector<int> arr, int target, int n){         // DP table to store the    // computed subproblems    vector<vector<int>> dp(arr.size() + 1 ,           vector<int> (target + 1, -1));          for(int i = 0; i < arr.size() + 1; i++)             // Initialize first        // column with 0        dp[i][0] = 0;             for(int j = 0; j < target + 1; j++)             // Initialize first        // row with 0        dp[0][j] = INT_MAX;             for(int i = 1; i <= arr.size(); i++)    {        for(int j = 1; j <= target; j++)        {                         // Check for invalid condition            if (arr[i - 1] > j)            {                dp[i][j] = dp[i - 1][j];            }            else            {                                 // Fill up the dp table                dp[i][j] = min(dp[i - 1][j],                   (dp[i][j - arr[i - 1]]) !=                   INT_MAX ?                    (dp[i][j - arr[i - 1]] + 1) :                    INT_MAX);            }        }    }Â
    // Print the minimum length    if (dp[arr.size()][target] == INT_MAX)    {        return -1;    }    else    {        return dp[arr.size()][target];     }}Â
// Driver codeint main(){Â Â Â Â vector<int> arr = { 2, 3, 5, 4, 1 };Â Â Â Â int target = 11;Â Â Â Â int n = arr.size();Â Â Â Â Â Â Â Â Â cout << minlt(arr, target, n);}Â
// This code is contributed by Surendra_Gangwar |
Java
// Java program for the above approachimport java.util.*;Â
class GFG{     // Function to find the smallest subarray// with sum greater than or equal targetstatic int minlt(int[] arr, int target, int n){         // DP table to store the    // computed subproblems    int[][] dp = new int[arr.length + 1][target + 1];         for(int[] row : dp)         Arrays.fill(row, -1);          for(int i = 0; i < arr.length + 1; i++)                 // Initialize first        // column with 0        dp[i][0] = 0;             for(int j = 0; j < target + 1; j++)Â
        // Initialize first        // row with 0        dp[0][j] = Integer.MAX_VALUE;             for(int i = 1; i <= arr.length; i++)    {        for(int j = 1; j <= target; j++)        {                         // Check for invalid condition            if (arr[i - 1] > j)            {                dp[i][j] = dp[i - 1][j];            }            else            {                                 // Fill up the dp table                dp[i][j] = Math.min(dp[i - 1][j],                        (dp[i][j - arr[i - 1]]) !=                        Integer.MAX_VALUE ?                         (dp[i][j - arr[i - 1]] + 1) :                         Integer.MAX_VALUE);            }        }    }Â
    // Print the minimum length    if (dp[arr.length][target] == Integer.MAX_VALUE)    {        return -1;    }    else    {        return dp[arr.length][target];     }}Â
// Driver codepublic static void main (String[] args) {Â Â Â Â int[] arr = { 2, 3, 5, 4, 1 };Â Â Â Â int target = 11;Â Â Â Â int n = arr.length;Â Â Â Â Â Â Â Â Â System.out.print(minlt(arr, target, n));}}Â
// This code is contributed by offbeat |
Python3
# Python3 program for the above approachÂ
import sysÂ
# Function to find the smallest subarray# with sum greater than or equal targetdef minlt(arr, target, n):Â
    # DP table to store the    # computed subproblems    dp = [[-1 for _ in range(target + 1)]\    for _ in range(len(arr)+1)]         for i in range(len(arr)+1):                 # Initialize first        # column with 0        dp[i][0] = 0             for j in range(target + 1):Â
        # Initialize first        # row with 0        dp[0][j] = sys.maxsizeÂ
    for i in range(1, len(arr)+1):        for j in range(1, target + 1):Â
            # Check for invalid condition            if arr[i-1] > j:                dp[i][j] = dp[i-1][j]Â
            else:                # Fill up the dp table                dp[i][j] = min(dp[i-1][j], \                1 + dp[i][j-arr[i-1]])                     return dp[-1][-1]Â
    # Print the minimum length    if dp[-1][-1] == sys.maxsize:        return(-1)    else:        return dp[-1][-1]Â
# Driver Codearr = [2, 3, 5, 4, 1]target = 11n = len(arr)Â
print(minlt(arr, target, n)) |
C#
// C# program for the// above approachusing System;class GFG{     // Function to find the // smallest subarray with // sum greater than or equal // targetstatic int minlt(int[] arr,                  int target,                  int n){     // DP table to store the  // computed subproblems  int[,] dp = new int[arr.Length + 1,                      target + 1];Â
  for(int i = 0;          i < arr.Length + 1; i++)  {    for (int j = 0;              j < target + 1; j++)     {      dp[i, j] = -1;    }  }Â
Â
  for(int i = 0;          i < arr.Length + 1; i++)Â
    // Initialize first    // column with 0    dp[i, 0] = 0;Â
  for(int j = 0;           j < target + 1; j++)Â
    // Initialize first    // row with 0    dp[0, j] = int.MaxValue;Â
  for(int i = 1;           i <= arr.Length; i++)  {    for(int j = 1;            j <= target; j++)    {      // Check for invalid      // condition      if (arr[i - 1] > j)      {        dp[i, j] = dp[i - 1, j];      }      else      {        // Fill up the dp table        dp[i, j] = Math.Min(dp[i - 1, j],                           (dp[i, j -                             arr[i - 1]]) !=                           int.MaxValue ?                            (dp[i, j -                             arr[i - 1]] + 1) :                            int.MaxValue);      }    }  }Â
  // Print the minimum   // length  if (dp[arr.Length,          target] == int.MaxValue)  {    return -1;  }  else  {    return dp[arr.Length,              target];   }}Â
// Driver codepublic static void Main(String[] args) {Â Â int[] arr = {2, 3, 5, 4, 1};Â Â int target = 11;Â Â int n = arr.Length;Â Â Console.Write(Â Â minlt(arr, target, n));}}Â
// This code is contributed by gauravrajput1 |
Javascript
<script>Â
// JavaScript program for the above approach     // Function to find the smallest subarray// with sum greater than or equal targetfunction minlt(arr, target, n){         // DP table to store the    // computed subproblems    var dp = Array.from(Array(arr.length+1),     ()=>Array(target+1).fill(-1));         for(var i = 0; i < arr.length + 1; i++)             // Initialize first        // column with 0        dp[i][0] = 0;             for(var j = 0; j < target + 1; j++)             // Initialize first        // row with 0        dp[0][j] = 1000000000;             for(var i = 1; i <= arr.length; i++)    {        for(var j = 1; j <= target; j++)        {                         // Check for invalid condition            if (arr[i - 1] > j)            {                dp[i][j] = dp[i - 1][j];            }            else            {                                 // Fill up the dp table                dp[i][j] = Math.min(dp[i - 1][j],                   (dp[i][j - arr[i - 1]]) !=                   1000000000 ?                    (dp[i][j - arr[i - 1]] + 1) :                    1000000000);            }        }    }Â
    // Print the minimum length    if (dp[arr.length][target] == 1000000000)    {        return -1;    }    else    {        return dp[arr.length][target];     }}Â
// Driver codeÂ
var arr = [2, 3, 5, 4, 1];var target = 11;var n = arr.length;Â
document.write( minlt(arr, target, n));Â
Â
</script> |
3
Time Complexity: O(N*Target)
Auxiliary Space: O(N*Target)
Efficient approach: Space Optimization
In the previous approach, the dp[i][j] is depend upon the previous row and current row values but it is using space of n* target 2D matrix. So to optimize the space complexity we use a 1D vector of size target + 1 just to store the previous and current computation.
Steps that were to follow the above approach:
- Create a vector ‘dp‘ of size target+1 and initialize all values to -1.
- Initialize the first element of ‘dp’ to 0, since a sum of 0 can be achieved by selecting no elements.
- Loop through the array ‘arr’ from the second element to the last, and for each element:
- Loop through the ‘dp’ vector from ‘target‘ down to 1.
- If the current element of ‘arr’ is greater than the current index of ‘dp’, continue to the next index.
- If the current index of ‘dp’ minus the current element of ‘arr’ is not equal to -1, update ‘dp’ with the minimum value between the current value of ‘dp’ at the
- current index and ‘dp‘ at the current index minus the current element of ‘arr’ plus 1.
- At last return the final answer stored in dp[target].
Below is the code to implement the above steps:
C++
// C++ code above approachÂ
#include <bits/stdc++.h>using namespace std;Â
// Function to find the smallest subarray// with sum greater than or equal targetint minlt(vector<int> arr, int target, int n){Â
    // DP table to store the    // computed subproblems    vector<int> dp(target + 1, -1);Â
    // Initialize first column with 0    dp[0] = 0;Â
    for (int i = 1; i <= n; i++) {        for (int j = target; j >= 1; j--) {Â
            // Check for invalid condition            if (arr[i - 1] > j) {                continue;            }            else {                // Fill up the dp table                if (dp[j - arr[i - 1]] != -1) {                    if (dp[j] == -1) {                        dp[j] = dp[j - arr[i - 1]] + 1;                    }                    else {                        dp[j] = min(dp[j],                                    dp[j - arr[i - 1]] + 1);                    }                }            }        }    }Â
    // Print the minimum length    return dp[target];}Â
// Driver codeint main(){Â Â Â Â vector<int> arr = { 2, 3, 5, 4, 1 };Â Â Â Â int target = 11;Â Â Â Â int n = arr.size();Â
    cout << minlt(arr, target, n);Â
    return 0;} |
Java
import java.util.*;Â
public class Main {    // Function to find the smallest subarray    // with sum greater than or equal target    public static int minlt(List<Integer> arr, int target, int n) {Â
        // DP table to store the        // computed subproblems        int[] dp = new int[target + 1];        Arrays.fill(dp, -1);Â
        // Initialize first column with 0        dp[0] = 0;Â
        for (int i = 1; i <= n; i++) {            for (int j = target; j >= 1; j--) {Â
                // Check for invalid condition                if (arr.get(i - 1) > j) {                    continue;                } else {                    // Fill up the dp table                    if (dp[j - arr.get(i - 1)] != -1) {                        if (dp[j] == -1) {                            dp[j] = dp[j - arr.get(i - 1)] + 1;                        } else {                            dp[j] = Math.min(dp[j], dp[j - arr.get(i - 1)] + 1);                        }                    }                }            }        }Â
        // Print the minimum length        return dp[target];    }Â
    // Driver code    public static void main(String[] args) {        List<Integer> arr = Arrays.asList(2, 3, 5, 4, 1);        int target = 11;        int n = arr.size();Â
        System.out.println(minlt(arr, target, n));    }} |
Python3
def min_subarray_with_sum(arr, target_sum):    n = len(arr)         # DP table to store the computed subproblems    dp = [-1] * (target_sum + 1)Â
    # Initialize first column with 0    dp[0] = 0Â
    for i in range(1, n + 1):        for j in range(target_sum, 0, -1):Â
            # Check for invalid condition            if arr[i - 1] > j:                continue            else:                # Fill up the dp table                if dp[j - arr[i - 1]] != -1:                    if dp[j] == -1:                        dp[j] = dp[j - arr[i - 1]] + 1                    else:                        dp[j] = min(dp[j], dp[j - arr[i - 1]] + 1)Â
    # Return the minimum length    return dp[target_sum]Â
# Example usage:arr = [2, 3, 5, 4, 1]target_sum = 11print(min_subarray_with_sum(arr, target_sum)) |
C#
using System;Â
namespace ConsoleApp1{    class Program    {        // Function to find the smallest subarray        // with sum greater than or equal target        static int minlt(int[] arr, int target, int n)        {            // DP table to store the            // computed subproblems            int[] dp = new int[target + 1];            Array.Fill(dp, -1);Â
            // Initialize first column with 0            dp[0] = 0;Â
            for (int i = 1; i <= n; i++)            {                for (int j = target; j >= 1; j--)                {                    // Check for invalid condition                    if (arr[i - 1] > j)                    {                        continue;                    }                    else                    {                        // Fill up the dp table                        if (dp[j - arr[i - 1]] != -1)                        {                            if (dp[j] == -1)                            {                                dp[j] = dp[j - arr[i - 1]] + 1;                            }                            else                            {                                dp[j] = Math.Min(dp[j], dp[j - arr[i - 1]] + 1);                            }                        }                    }                }            }Â
            // Print the minimum length            return dp[target];        }Â
        // Driver code        static void Main(string[] args)        {            int[] arr = { 2, 3, 5, 4, 1 };            int target = 11;            int n = arr.Length;Â
            Console.WriteLine(minlt(arr, target, n));        }    }} |
Javascript
// Javascript code above approachÂ
// Function to find the smallest subarray// with sum greater than or equal targetfunction minlt(arr, target, n) {Â
    // DP table to store the    // computed subproblems    let dp = new Array(target + 1).fill(-1);         // Initialize first column with 0    dp[0] = 0;         for (let i = 1; i <= n; i++) {        for (let j = target; j >= 1; j--) {                 // Check for invalid condition            if (arr[i - 1] > j) {                continue;            }            else {                // Fill up the dp table                if (dp[j - arr[i - 1]] != -1) {                    if (dp[j] == -1) {                        dp[j] = dp[j - arr[i - 1]] + 1;                    }                    else {                        dp[j] = Math.min(dp[j], dp[j - arr[i - 1]] + 1);                    }                }            }        }    }         // Print the minimum length    return dp[target];}Â
// Driver codelet arr = [ 2, 3, 5, 4, 1 ];let target = 11;let n = arr.length;Â
console.log(minlt(arr, target, n)); |
Output
3
Time Complexity: O(N*target)
Auxiliary Space: O(N*Target)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Read More Information here to that Topic: geeksforgeeks.org/smallest-subarray-from-a-given-array-with-sum-greater-than-or-equal-to-k-set-2/ […]