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

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:
- Invert the elements of the array arr[] i.e. change positive numbers to negative and vice versa.
- Iterate in the range [0, N-1] using the variable i:Â
- Find the  maximum subarray sum for subarray arr[i, N-1] using kadane’s algorithm.
- Invert the result again and print the result.
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 subarrayint 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 suffixvoid 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 codeint 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 approachimport java.io.*;Â
class GFG{Â Â Â Â Â // Kadane's Algorithm to find max// sum subarraystatic 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 suffixstatic 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 codepublic 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 subarraydef 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 suffixdef 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 codeif __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 approachusing System;Â
class GFG{Â Â Â Â Â // Kadane's Algorithm to find max// sum subarraystatic 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 suffixstatic 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 codepublic 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 subarrayfunction 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 suffixfunction 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 Inputlet n = 5;let arr = [ 5, -3, -2, 9, 4 ];Â
// Function CallminSubarraySum(arr, n);Â
// This code is contributed by gfgkingÂ
</script> |
-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 approachimport 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 coden = 5arr = [5, -3, -2, 9, 4]Â
# Function CallminSubarraySum(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 CallminSubarraySum(arr, n);Â
// This code is contributed by akashish__ |
-5 -5 -2 4 4
Time Complexity: O(N)
Auxiliary Space: O(N)
Related Topic: Subarrays, Subsequences, and Subsets in Array
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



