Maximum contiguous decreasing sequence obtained by removing any one element
Last Updated :
05 Jul, 2022
Given an array arr[] of N integers. The task is to find the length of the contiguous strictly decreasing sequence that can be derived after removing at most one element from the array arr[].
Examples
Input: arr[] = {8, 7, 3, 5, 2, 9}
Output: 4
Explanation:
If we remove 3, The maximum length of decreasing sequence is 4 and the sequence is { 8, 7, 5, 2 }
If we remove 5, The maximum length of decreasing sequence is 4 and the sequence is { 8, 7, 3, 2 }
In both removal we get 4 as the maximum length.
Input: arr[] = {1, 2, 9, 8, 3, 7, 6, 4}
Output: 5
Approach:
- Create two arrays, left[] which stores the length of decreasing sequence from left to right and right[] which stores the length of decreasing sequence from right to left.
- Traverse the given array arr[].
- If previous element(arr[i-1]) is greater than the next element(arr[i+1]), then check whether removing that element will give the maximum length of decreasing subsequence or not.
- Update the maximum length of decreasing subsequence.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxLength( int * a, int n)
{
int maximum = 1;
int left[n];
int right[n];
for ( int i = 0; i < n; i++) {
left[i] = 1;
right[i] = 1;
}
for ( int i = n - 2; i >= 0; i--) {
if (a[i] > a[i + 1]) {
right[i] = right[i + 1] + 1;
}
maximum = max(maximum, right[i]);
}
for ( int i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
left[i] = left[i - 1] + 1;
}
}
if (n > 2) {
for ( int i = 1; i < n - 1; i++) {
if (a[i - 1] > a[i + 1]) {
maximum = max(maximum,
left[i - 1] + right[i + 1]);
}
}
}
return maximum;
}
int main()
{
int arr[6] = { 8, 7, 3, 5, 2, 9 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << maxLength(arr, n) << endl;
return 0;
}
|
Java
class GFG {
static int maxLength( int []a, int n)
{
int maximum = 1 ;
int left [] = new int [n];
int right[] = new int [n];
for ( int i = 0 ; i < n; i++) {
left[i] = 1 ;
right[i] = 1 ;
}
for ( int i = n - 2 ; i >= 0 ; i--) {
if (a[i] > a[i + 1 ]) {
right[i] = right[i + 1 ] + 1 ;
}
maximum = Math.max(maximum, right[i]);
}
for ( int i = 1 ; i < n; i++) {
if (a[i] < a[i - 1 ]) {
left[i] = left[i - 1 ] + 1 ;
}
}
if (n > 2 ) {
for ( int i = 1 ; i < n - 1 ; i++) {
if (a[i - 1 ] > a[i + 1 ]) {
maximum = Math.max(maximum, left[i - 1 ] + right[i + 1 ]);
}
}
}
return maximum;
}
public static void main (String[] args)
{
int arr[] = { 8 , 7 , 3 , 5 , 2 , 9 };
int n = arr.length;
System.out.println(maxLength(arr, n));
}
}
|
Python3
def maxLength(a, n) :
maximum = 1 ;
left = [ 0 ] * n;
right = [ 0 ] * n;
for i in range (n) :
left[i] = 1 ;
right[i] = 1 ;
for i in range (n - 2 , - 1 , - 1 ) :
if (a[i] > a[i + 1 ]) :
right[i] = right[i + 1 ] + 1 ;
maximum = max (maximum, right[i]);
for i in range ( 1 , n) :
if (a[i] < a[i - 1 ]) :
left[i] = left[i - 1 ] + 1 ;
if (n > 2 ) :
for i in range ( 1 , n - 1 ) :
if (a[i - 1 ] > a[i + 1 ]) :
maximum = max (maximum, left[i - 1 ] + right[i + 1 ]);
return maximum;
if __name__ = = "__main__" :
arr = [ 8 , 7 , 3 , 5 , 2 , 9 ];
n = len (arr);
print (maxLength(arr, n));
|
C#
using System;
class GFG {
static int maxLength( int []a, int n)
{
int maximum = 1;
int []left = new int [n];
int []right = new int [n];
for ( int i = 0; i < n; i++) {
left[i] = 1;
right[i] = 1;
}
for ( int i = n - 2; i >= 0; i--) {
if (a[i] > a[i + 1]) {
right[i] = right[i + 1] + 1;
}
maximum = Math.Max(maximum, right[i]);
}
for ( int i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
left[i] = left[i - 1] + 1;
}
}
if (n > 2) {
for ( int i = 1; i < n - 1; i++) {
if (a[i - 1] > a[i + 1]) {
maximum = Math.Max(maximum, left[i - 1] + right[i + 1]);
}
}
}
return maximum;
}
public static void Main (String[] args)
{
int []arr = { 8, 7, 3, 5, 2, 9 };
int n = arr.Length;
Console.WriteLine(maxLength(arr, n));
}
}
|
Javascript
<script>
function maxLength(a, n)
{
let maximum = 1;
let left = new Array(n);
let right = new Array(n);
for (let i = 0; i < n; i++) {
left[i] = 1;
right[i] = 1;
}
for (let i = n - 2; i >= 0; i--) {
if (a[i] > a[i + 1]) {
right[i] = right[i + 1] + 1;
}
maximum = Math.max(maximum, right[i]);
}
for (let i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
left[i] = left[i - 1] + 1;
}
}
if (n > 2) {
for (let i = 1; i < n - 1; i++) {
if (a[i - 1] > a[i + 1]) {
maximum = Math.max(maximum,
left[i - 1] + right[i + 1]);
}
}
}
return maximum;
}
let arr = [ 8, 7, 3, 5, 2, 9 ];
let n = arr.length;
document.write(maxLength(arr, n) + "<br>" );
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...