Open In App

Find minimum subarray sum for each index i in subarray [i, N-1]

Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[] of size N, the task is to find the minimum subarray sum in the subarrays [i, N-1] for all i in [0, N-1].

Examples:

Input: arr[ ] = {3, -1, -2}
Output: -3 -3 -2
Explanation: 
For (i = 1) i.e. {3, -1, -2}, the minimum subarray sum is -3 for {-1, -2}.
For (i = 2) i.e. {-1, -2}, the minimum subarray sum is -3 for {-1, -2}.
For (i = 3) i.e. {-2}, the minimum subarray sum is -2 for {-2}.

Input: arr[ ] = {5, -3, -2, 9, 4}
Output: -5 -5 -2 4 4

Approach: The problem can be solved by using the standard Kadane’s algorithm for maximum subarray sum. Follow the steps below to solve this problem:

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Kadane's Algorithm to find max
// sum subarray
int kadane(int arr[], int start, int end)
{
    int currMax = arr[start];
    int maxSoFar = arr[start];
 
    // Iterating from start to end
    for (int i = start + 1; i < end + 1; i++) {
 
        currMax = max(arr[i], arr[i] + currMax);
        maxSoFar = max(maxSoFar, currMax);
    }
 
    // Returning maximum sum
    return maxSoFar;
}
 
// Function to find the minimum subarray
// sum for each suffix
void minSubarraySum(int arr[], int n)
{
 
    // Inverting all the elements of
    // array arr[].
    for (int i = 0; i < n; i++) {
        arr[i] = -arr[i];
    }
 
    // Finding the result for each
    // subarray
    for (int i = 0; i < n; i++) {
 
        // Finding the max subarray sum
        int result = kadane(arr, i, n - 1);
 
        // Inverting the result
        result = -result;
 
        // Print the result
        cout << result << " ";
    }
}
 
// Driver code
int main()
{
 
    // Given Input
    int n = 5;
    int arr[] = { 5, -3, -2, 9, 4 };
 
    // Function Call
    minSubarraySum(arr, n);
 
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
 
class GFG{
     
// Kadane's Algorithm to find max
// sum subarray
static int kadane(int arr[], int start, int end)
{
    int currMax = arr[start];
    int maxSoFar = arr[start];
 
    // Iterating from start to end
    for(int i = start + 1; i < end + 1; i++)
    {
        currMax = Math.max(arr[i], arr[i] + currMax);
        maxSoFar = Math.max(maxSoFar, currMax);
    }
 
    // Returning maximum sum
    return maxSoFar;
}
 
// Function to find the minimum subarray
// sum for each suffix
static void minSubarraySum(int arr[], int n)
{
     
    // Inverting all the elements of
    // array arr[].
    for(int i = 0; i < n; i++)
    {
        arr[i] = -arr[i];
    }
 
    // Finding the result for each
    // subarray
    for(int i = 0; i < n; i++)
    {
         
        // Finding the max subarray sum
        int result = kadane(arr, i, n - 1);
 
        // Inverting the result
        result = -result;
 
        // Print the result
        System.out.print(result + " ");
    }
}
 
// Driver code
public static void main(String[] args)
{
     
    // Given Input
    int n = 5;
    int arr[] = { 5, -3, -2, 9, 4 };
     
    // Function Call
    minSubarraySum(arr, n);
}
}
 
// This code is contributed by Potta Lokesh


Python3




# Python3 program for the above approach
 
# Kadane's Algorithm to find max
# sum subarray
def kadane(arr, start, end):
     
    currMax = arr[start]
    maxSoFar = arr[start]
 
    # Iterating from start to end
    for i in range(start + 1,end + 1, 1):
        currMax = max(arr[i], arr[i] + currMax)
        maxSoFar = max(maxSoFar, currMax)
 
    # Returning maximum sum
    return maxSoFar
 
# Function to find the minimum subarray
# sum for each suffix
def minSubarraySum(arr, n):
     
    # Inverting all the elements of
    # array arr[].
    for i in range(n):
        arr[i] = -arr[i]
 
    # Finding the result for each
    # subarray
    for i in range(n):
         
        # Finding the max subarray sum
        result = kadane(arr, i, n - 1)
 
        # Inverting the result
        result = -result
 
        # Print the result
        print(result, end = " ")
 
# Driver code
if __name__ == '__main__':
     
    # Given Input
    n = 5
    arr = [ 5, -3, -2, 9, 4 ]
 
    # Function Call
    minSubarraySum(arr, n)
     
# This code is contributed by SURENDRA_GANGWAR


C#




// C# program for the above approach
using System;
 
class GFG{
     
// Kadane's Algorithm to find max
// sum subarray
static int kadane(int []arr, int start, int end)
{
    int currMax = arr[start];
    int maxSoFar = arr[start];
 
    // Iterating from start to end
    for(int i = start + 1; i < end + 1; i++)
    {
        currMax = Math.Max(arr[i], arr[i] + currMax);
        maxSoFar = Math.Max(maxSoFar, currMax);
    }
 
    // Returning maximum sum
    return maxSoFar;
}
 
// Function to find the minimum subarray
// sum for each suffix
static void minSubarraySum(int []arr, int n)
{
     
    // Inverting all the elements of
    // array arr[].
    for(int i = 0; i < n; i++)
    {
        arr[i] = -arr[i];
    }
 
    // Finding the result for each
    // subarray
    for(int i = 0; i < n; i++)
    {
         
        // Finding the max subarray sum
        int result = kadane(arr, i, n - 1);
 
        // Inverting the result
        result = -result;
 
        // Print the result
        Console.Write(result + " ");
    }
}
 
// Driver code
public static void Main(String[] args)
{
     
    // Given Input
    int n = 5;
    int []arr = { 5, -3, -2, 9, 4 };
     
    // Function Call
    minSubarraySum(arr, n);
}
}
 
// This code is contributed by shivanisinghss2110


Javascript




<script>
 
// Javascript program for the above approach
 
// Kadane's Algorithm to find max
// sum subarray
function kadane(arr, start, end)
{
    let currMax = arr[start];
    let maxSoFar = arr[start];
 
    // Iterating from start to end
    for(let i = start + 1; i < end + 1; i++)
    {
        currMax = Math.max(arr[i], arr[i] + currMax);
        maxSoFar = Math.max(maxSoFar, currMax);
    }
 
    // Returning maximum sum
    return maxSoFar;
}
 
// Function to find the minimum subarray
// sum for each suffix
function minSubarraySum(arr, n)
{
     
    // Inverting all the elements of
    // array arr[].
    for(let i = 0; i < n; i++)
    {
        arr[i] = -arr[i];
    }
 
    // Finding the result for each
    // subarray
    for(let i = 0; i < n; i++)
    {
         
        // Finding the max subarray sum
        let result = kadane(arr, i, n - 1);
 
        // Inverting the result
        result = -result;
 
        // Print the result
        document.write(result + " ");
    }
}
 
// Driver code
 
// Given Input
let n = 5;
let arr = [ 5, -3, -2, 9, 4 ];
 
// Function Call
minSubarraySum(arr, n);
 
// This code is contributed by gfgking
 
</script>


Output

-5 -5 -2 4 4 

Time Complexity: O(N^2)
Auxiliary Space: O(1)

Efficient Approach: The repetitive process of finding the maximum subarray sum using Kadane’s can be optimized further by traversing the array from the back and storing the maximum negative sum till that point from the end.

Below is the code implementation of the above approach:

C++




#include <bits/stdc++.h>
using namespace std;
 
void minSubarraySum(int arr[], int n)
{
    vector<int> res(n);
    for (int i = 0; i < n; i++)
        arr[i] *= -1;
    int sum = 0;
    int maxSum = INT_MIN;
 
    for (int i = n - 1; i >= 0; i--) {
        sum += arr[i];
        maxSum = max(sum, maxSum);
 
        // Store result for [i,n-1]
        res[i] = -maxSum;
        if (sum < 0)
            sum = 0;
    }
 
    for (int i : res)
        cout << i << " ";
}
 
int main()
{
    int n = 5;
    int arr[] = { 5, -3, -2, 9, 4 };
 
    // Function Call
    minSubarraySum(arr, n);
    return 0;
}


Java




// Java code to implement the approach
import java.io.*;
class GFG {
 
    public static void minSubarraySum(int arr[], int n)
    {
        int[] res = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] *= -1;
        int sum = 0;
        int maxSum = Integer.MIN_VALUE;
 
        for (int i = n - 1; i >= 0; i--) {
            sum += arr[i];
            maxSum = Math.max(sum, maxSum);
 
            // Store result for [i,n-1]
            res[i] = -maxSum;
            if (sum < 0)
                sum = 0;
        }
 
        for (int i : res)
            System.out.print(i + " ");
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int n = 5;
        int arr[] = { 5, -3, -2, 9, 4 };
 
        // Function Call
        minSubarraySum(arr, n);
    }
}
 
// This code is contributed by aarohirai2616.


Python3




def minSubarraySum(arr, n):
 
    res = [0]*n
    for i in range(0, n):
        arr[i] *= -1
    suma = 0
    maxSum = -9223372036854775808
 
    i = n - 1
    while(i >= 0):
        suma += arr[i]
        maxSum = max(suma, maxSum)
 
        # Store result for [i,n-1]
        res[i] = -maxSum
        if (suma < 0):
            suma = 0
        i = i-1
    for i in range(0, n):
        print(res[i], end=" ")
 
 
# Driver code
n = 5
arr = [5, -3, -2, 9, 4]
 
# Function Call
minSubarraySum(arr, n)
 
# This code is contributed by aarohirai2616.


C#




// C# code to implement the approach
 
using System;
 
public class GFG {
 
    public static void minSubarraySum(int[] arr, int n)
    {
        int[] res = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] *= -1;
        int sum = 0;
        int maxSum = Int32.MinValue;
 
        for (int i = n - 1; i >= 0; i--) {
            sum += arr[i];
            maxSum = Math.Max(sum, maxSum);
 
            // Store result for [i,n-1]
            res[i] = -maxSum;
            if (sum < 0)
                sum = 0;
        }
 
        for (int i = 0; i < n; i++) {
            Console.Write(res[i] + " ");
        }
    }
 
    static public void Main()
    {
 
        // Code
        int n = 5;
        int[] arr = { 5, -3, -2, 9, 4 };
 
        // Function Call
        minSubarraySum(arr, n);
    }
}
 
// This code is contributed by lokeshmvs21.


Javascript




function minSubarraySum(arr, n)
{
    let res = [];
    for(let i=0;i<n;i++)
    {
        res.push(0);
    }
    for (let i = 0; i < n; i++)
        arr[i] *= -1;
    let sum = 0;
    let maxSum = -2147483647 - 1;
 
    for (let i = n - 1; i >= 0; i--) {
        sum += arr[i];
        maxSum = Math.max(sum, maxSum);
 
        // Store result for [i,n-1]
        res[i] = -1*maxSum;
        if (sum < 0)
            sum = 0;
    }
 
    console.log(res);
}
 
 
let n = 5;
let arr = [ 5, -3, -2, 9, 4 ];
 
// Function Call
minSubarraySum(arr, n);
 
// This code is contributed by akashish__


Output

-5 -5 -2 4 4 

Time Complexity: O(N)
Auxiliary Space: O(N)

Related Topic: Subarrays, Subsequences, and Subsets in Array



Last Updated : 29 Dec, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads