Find Maximum Sum Strictly Increasing Subarray
Given an array of positive integers. Find the maximum sum of strictly increasing subarrays. Note that this problem is different from maximum subarray sum and maximum sum increasing subsequence problems.
Examples:
Input : arr[] = {1, 2, 3, 2, 5, 1, 7}
Output : 8
Explanation : Some Strictly increasing subarrays are
{1, 2, 3} sum = 6,
{2, 5} sum = 7,
{1, 7} sum 8
Maximum Sum = 8
Input : arr[] = {1, 2, 2, 4}
Output: 6
Explanation : Increasing subarray with maximum sum is 6.
A Simple Solution is to generate all possible subarrays, and for every subarray check if subarray is strictly increasing or not. If subarray is strictly increasing, then we calculate sum & update max_sum. Time complexity O(n2).
An efficient solution of this problem take O(n) time. The idea is keep track of maximum sum and current sum. For every element arr[i], if it is greater than arr[i-1], then we add it to current sum. Else arr[i] is starting point of another potential candidate for maximum sum increasing subarray, so we update current sum as array. But before updating current sum, we update maximum sum if required.
Let input array be 'arr[]' and size of array be 'n'
Initialize :
max_sum = arr[0]
// because if array size is 1 than it
// would return that element.
// used to store the maximum sum
current_sum = arr[0] // used to compute current sum
// Traverse array starting from second element
i goes from 1 to n-1
// Check if it is strictly increasing then we
// update current_sum.
current_sum = current_sum + arr[i]
max_sum = max(max_sum, current_sum)
// Also needed for subarray having last element.
// else strictly increasing subarray breaks and
// arr[i] is starting point of next potential
// subarray
max_sum = max(max_sum, current_sum)
current_sum = arr[i]
return max(max_sum, current_sum)
Below is the implementation of the above idea.
C++
#include <iostream>
using namespace std;
int maxsum_SIS( int arr[], int n)
{
int max_sum = arr[0];
int current_sum = arr[0];
for ( int i = 1; i < n; i++)
{
if (arr[i - 1] < arr[i])
{
current_sum = current_sum + arr[i];
max_sum = max(max_sum, current_sum);
}
else
{
max_sum = max(max_sum, current_sum);
current_sum = arr[i];
}
}
return max(max_sum, current_sum);
}
int main()
{
int arr[] = { 1, 2, 2, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Maximum sum : " << maxsum_SIS(arr, n);
return 0;
}
|
Java
public class GFG {
static int maxsum_SIS( int arr[], int n)
{
int max_sum = arr[ 0 ];
int current_sum = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
{
if (arr[i - 1 ] < arr[i])
{
current_sum = current_sum + arr[i];
max_sum = Math.max(max_sum, current_sum);
}
else
{
max_sum = Math.max(max_sum, current_sum);
current_sum = arr[i];
}
}
return Math.max(max_sum, current_sum);
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 2 , 4 };
int n = arr.length;
System.out.println( "Maximum sum : "
+ maxsum_SIS(arr, n));
}
}
|
Python3
def maxsum_SIS(arr, n):
max_sum = arr[ 0 ]
current_sum = arr[ 0 ]
for i in range ( 1 , n):
if (arr[i - 1 ] < arr[i]):
current_sum = current_sum + arr[i]
max_sum = max (max_sum, current_sum)
else :
max_sum = max (max_sum, current_sum)
current_sum = arr[i]
return max (max_sum, current_sum)
def main():
arr = [ 1 , 2 , 2 , 4 ]
n = len (arr)
print ( "Maximum sum : " , maxsum_SIS(arr, n)),
if __name__ = = '__main__' :
main()
|
C#
using System;
public class GFG {
static int maxsum_SIS( int [] arr, int n)
{
int max_sum = arr[0];
int current_sum = arr[0];
for ( int i = 1; i < n; i++) {
if (arr[i - 1] < arr[i]) {
current_sum = current_sum + arr[i];
max_sum = Math.Max(max_sum, current_sum);
}
else
{
max_sum = Math.Max(max_sum, current_sum);
current_sum = arr[i];
}
}
return Math.Max(max_sum, current_sum);
}
public static void Main()
{
int [] arr = { 1, 2, 2, 4 };
int n = arr.Length;
Console.WriteLine( "Maximum sum : "
+ maxsum_SIS(arr, n));
}
}
|
PHP
<?php
function maxsum_SIS( $arr , $n )
{
$max_sum = $arr [0];
$current_sum = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
{
if ( $arr [ $i - 1] < $arr [ $i ]){
$current_sum = $current_sum + $arr [ $i ];
$max_sum = max( $max_sum , $current_sum );
}
else
{
$max_sum = max( $max_sum , $current_sum );
$current_sum = $arr [ $i ];
}
}
return max( $max_sum , $current_sum );
}
$arr = array (1, 2, 2, 4);
$n = sizeof( $arr );
echo "Maximum sum : " ,
maxsum_SIS( $arr , $n );
?>
|
Javascript
<script>
function maxsum_SIS(arr, n)
{
var max_sum = arr[0];
var current_sum = arr[0];
for ( var i = 1; i < n; i++)
{
if (arr[i - 1] < arr[i])
{
current_sum = current_sum + arr[i];
max_sum = Math.max(max_sum, current_sum);
}
else
{
max_sum = Math.max(max_sum, current_sum);
current_sum = arr[i];
}
}
return Math.max(max_sum, current_sum);
}
var arr = [ 1, 2, 2, 4 ];
var n = arr.length;
document.write( "Maximum sum : " + maxsum_SIS(arr, n));
</script>
|
Time complexity : O(n)
Auxiliary Space : O(1)
Last Updated :
06 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...