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:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int kadane( int arr[], int start, int end)
{
int currMax = arr[start];
int maxSoFar = arr[start];
for ( int i = start + 1; i < end + 1; i++) {
currMax = max(arr[i], arr[i] + currMax);
maxSoFar = max(maxSoFar, currMax);
}
return maxSoFar;
}
void minSubarraySum( int arr[], int n)
{
for ( int i = 0; i < n; i++) {
arr[i] = -arr[i];
}
for ( int i = 0; i < n; i++) {
int result = kadane(arr, i, n - 1);
result = -result;
cout << result << " " ;
}
}
int main()
{
int n = 5;
int arr[] = { 5, -3, -2, 9, 4 };
minSubarraySum(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG{
static int kadane( int arr[], int start, int end)
{
int currMax = arr[start];
int maxSoFar = arr[start];
for ( int i = start + 1 ; i < end + 1 ; i++)
{
currMax = Math.max(arr[i], arr[i] + currMax);
maxSoFar = Math.max(maxSoFar, currMax);
}
return maxSoFar;
}
static void minSubarraySum( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
{
arr[i] = -arr[i];
}
for ( int i = 0 ; i < n; i++)
{
int result = kadane(arr, i, n - 1 );
result = -result;
System.out.print(result + " " );
}
}
public static void main(String[] args)
{
int n = 5 ;
int arr[] = { 5 , - 3 , - 2 , 9 , 4 };
minSubarraySum(arr, n);
}
}
|
Python3
def kadane(arr, start, end):
currMax = arr[start]
maxSoFar = arr[start]
for i in range (start + 1 ,end + 1 , 1 ):
currMax = max (arr[i], arr[i] + currMax)
maxSoFar = max (maxSoFar, currMax)
return maxSoFar
def minSubarraySum(arr, n):
for i in range (n):
arr[i] = - arr[i]
for i in range (n):
result = kadane(arr, i, n - 1 )
result = - result
print (result, end = " " )
if __name__ = = '__main__' :
n = 5
arr = [ 5 , - 3 , - 2 , 9 , 4 ]
minSubarraySum(arr, n)
|
C#
using System;
class GFG{
static int kadane( int []arr, int start, int end)
{
int currMax = arr[start];
int maxSoFar = arr[start];
for ( int i = start + 1; i < end + 1; i++)
{
currMax = Math.Max(arr[i], arr[i] + currMax);
maxSoFar = Math.Max(maxSoFar, currMax);
}
return maxSoFar;
}
static void minSubarraySum( int []arr, int n)
{
for ( int i = 0; i < n; i++)
{
arr[i] = -arr[i];
}
for ( int i = 0; i < n; i++)
{
int result = kadane(arr, i, n - 1);
result = -result;
Console.Write(result + " " );
}
}
public static void Main(String[] args)
{
int n = 5;
int []arr = { 5, -3, -2, 9, 4 };
minSubarraySum(arr, n);
}
}
|
Javascript
<script>
function kadane(arr, start, end)
{
let currMax = arr[start];
let maxSoFar = arr[start];
for (let i = start + 1; i < end + 1; i++)
{
currMax = Math.max(arr[i], arr[i] + currMax);
maxSoFar = Math.max(maxSoFar, currMax);
}
return maxSoFar;
}
function minSubarraySum(arr, n)
{
for (let i = 0; i < n; i++)
{
arr[i] = -arr[i];
}
for (let i = 0; i < n; i++)
{
let result = kadane(arr, i, n - 1);
result = -result;
document.write(result + " " );
}
}
let n = 5;
let arr = [ 5, -3, -2, 9, 4 ];
minSubarraySum(arr, n);
</script>
|
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);
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 };
minSubarraySum(arr, n);
return 0;
}
|
Java
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);
res[i] = -maxSum;
if (sum < 0 )
sum = 0 ;
}
for ( int i : res)
System.out.print(i + " " );
}
public static void main(String[] args)
{
int n = 5 ;
int arr[] = { 5 , - 3 , - 2 , 9 , 4 };
minSubarraySum(arr, n);
}
}
|
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)
res[i] = - maxSum
if (suma < 0 ):
suma = 0
i = i - 1
for i in range ( 0 , n):
print (res[i], end = " " )
n = 5
arr = [ 5 , - 3 , - 2 , 9 , 4 ]
minSubarraySum(arr, n)
|
C#
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);
res[i] = -maxSum;
if (sum < 0)
sum = 0;
}
for ( int i = 0; i < n; i++) {
Console.Write(res[i] + " " );
}
}
static public void Main()
{
int n = 5;
int [] arr = { 5, -3, -2, 9, 4 };
minSubarraySum(arr, n);
}
}
|
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);
res[i] = -1*maxSum;
if (sum < 0)
sum = 0;
}
console.log(res);
}
let n = 5;
let arr = [ 5, -3, -2, 9, 4 ];
minSubarraySum(arr, n);
|
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
Share your thoughts in the comments
Please Login to comment...