Given an array arr[] of N integers, the task is to find the maximum length of any sub-array of arr[] which satisfies one of the given conditions:
- The subarray is strictly increasing.
- The subarray is strictly decreasing.
- The subarray is first strictly increasing then strictly decreasing.
Examples:
Input: arr[] = {1, 2, 2, 1, 3}
Output: 2
{1, 2}, {2, 1} and {1, 3} are the valid subarrays.
Input: arr[] = {5, 4, 3, 2, 1, 2, 3, 4}
Output: 5
{5, 4, 3, 2, 1} is the required subarray.
Approach: Create an array incEnding[] where incEnding[i] will store the length of the largest increasing subarray of the given array ending at index i. Similarly, create another array decStarting[] where decStarting[i] will store the length of the largest decreasing subarray of the given array starting at the index i. Now start traversing the original array and for every element, assume it to be the mid of the required subarray then the length of the largest required subarray whose mid at index i will be incEnding[i] + decStarting[i] – 1. Note that 1 is subtracted because arr[i] will be counted twice for both the increasing and the decreasing subarray.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int largestSubArr( int arr[], int n)
{
int incEnding[n] = { 0 };
incEnding[0] = 1;
for ( int i = 1; i < n; i++) {
if (arr[i - 1] < arr[i])
incEnding[i] = incEnding[i - 1] + 1;
else
incEnding[i] = 1;
}
int decStarting[n] = { 0 };
decStarting[n - 1] = 1;
for ( int i = n - 2; i >= 0; i--) {
if (arr[i + 1] < arr[i])
decStarting[i] = decStarting[i + 1] + 1;
else
decStarting[i] = 1;
}
int maxSubArr = 0;
for ( int i = 0; i < n; i++) {
maxSubArr = max(maxSubArr, incEnding[i]
+ decStarting[i] - 1);
}
return maxSubArr;
}
int main()
{
int arr[] = { 1, 2, 2, 1, 3 };
int n = sizeof (arr) / sizeof ( int );
cout << largestSubArr(arr, n);
return 0;
}
|
Java
class GFG
{
static int largestSubArr( int arr[], int n)
{
int incEnding[] = new int [n];
int i;
for (i = 0 ; i < n ; i++)
incEnding[i] = 0 ;
incEnding[ 0 ] = 1 ;
for (i = 1 ; i < n; i++)
{
if (arr[i - 1 ] < arr[i])
incEnding[i] = incEnding[i - 1 ] + 1 ;
else
incEnding[i] = 1 ;
}
int decStarting[] = new int [n];
for (i = 0 ; i < n ; i++)
decStarting[i] = 0 ;
decStarting[n - 1 ] = 1 ;
for (i = n - 2 ; i >= 0 ; i--)
{
if (arr[i + 1 ] < arr[i])
decStarting[i] = decStarting[i + 1 ] + 1 ;
else
decStarting[i] = 1 ;
}
int maxSubArr = 0 ;
for (i = 0 ; i < n; i++)
{
maxSubArr = Math.max(maxSubArr, incEnding[i] +
decStarting[i] - 1 );
}
return maxSubArr;
}
public static void main (String[] args)
{
int arr[] = { 1 , 2 , 2 , 1 , 3 };
int n = arr.length;
System.out.println(largestSubArr(arr, n));
}
}
|
Python3
def largestSubArr(arr, n) :
incEnding = [ 0 ] * n
incEnding[ 0 ] = 1
for i in range ( 1 , n) :
if (arr[i - 1 ] < arr[i]) :
incEnding[i] = incEnding[i - 1 ] + 1
else :
incEnding[i] = 1
decStarting = [ 0 ] * n
decStarting[n - 1 ] = 1
for i in range (n - 2 , - 1 , - 1 ):
if (arr[i + 1 ] < arr[i]) :
decStarting[i] = decStarting[i + 1 ] + 1
else :
decStarting[i] = 1
maxSubArr = 0
for i in range (n):
maxSubArr = max (maxSubArr, incEnding[i] +
decStarting[i] - 1 )
return maxSubArr
arr = [ 1 , 2 , 2 , 1 , 3 ]
n = len (arr)
print (largestSubArr(arr, n))
|
C#
using System;
class GFG
{
static int largestSubArr( int []arr, int n)
{
int []incEnding = new int [n];
int i;
for (i = 0; i < n ; i++)
incEnding[i] = 0;
incEnding[0] = 1;
for (i = 1; i < n; i++)
{
if (arr[i - 1] < arr[i])
incEnding[i] = incEnding[i - 1] + 1;
else
incEnding[i] = 1;
}
int []decStarting = new int [n];
for (i = 0; i < n ; i++)
decStarting[i] = 0;
decStarting[n - 1] = 1;
for (i = n - 2; i >= 0; i--)
{
if (arr[i + 1] < arr[i])
decStarting[i] = decStarting[i + 1] + 1;
else
decStarting[i] = 1;
}
int maxSubArr = 0;
for (i = 0; i < n; i++)
{
maxSubArr = Math.Max(maxSubArr, incEnding[i] +
decStarting[i] - 1);
}
return maxSubArr;
}
public static void Main (String[] args)
{
int []arr = { 1, 2, 2, 1, 3 };
int n = arr.Length;
Console.WriteLine(largestSubArr(arr, n));
}
}
|
Javascript
<script>
function largestSubArr(arr, n)
{
var incEnding = Array(n).fill(0);
incEnding[0] = 1;
for ( var i = 1; i < n; i++)
{
if (arr[i - 1] < arr[i])
incEnding[i] = incEnding[i - 1] + 1;
else
incEnding[i] = 1;
}
var decStarting = Array(n).fill(0);
decStarting[n - 1] = 1;
for ( var i = n - 2; i >= 0; i--)
{
if (arr[i + 1] < arr[i])
decStarting[i] = decStarting[i + 1] + 1;
else
decStarting[i] = 1;
}
var maxSubArr = 0;
for ( var i = 0; i < n; i++)
{
maxSubArr = Math.max(maxSubArr,
incEnding[i] +
decStarting[i] - 1);
}
return maxSubArr;
}
var arr = [ 1, 2, 2, 1, 3 ];
var n = arr.length;
document.write(largestSubArr(arr, n));
</script>
|
Time complexity: O(n) where n is the size of the given array
Auxiliary space: O(n) because using extra space for arrays incEnding and decStarting
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!