Check whether an array can be made strictly increasing by modifying atmost one element
Last Updated :
21 Jun, 2022
Given an array arr[] of positive integers, the task is to find whether it is possible to make this array strictly increasing by modifying atmost one element.
Examples:
Input: arr[] = {2, 4, 8, 6, 9, 12}
Output: Yes
By modifying 8 to 5, array will become strictly increasing.
i.e. {2, 4, 5, 6, 9, 12}
Input: arr[] = {10, 5, 2}
Output: No
Approach: For every element arr[i], if it is greater than both arr[i – 1] and arr[i + 1] or it is smaller than both arr[i – 1] and arr[i + 1] then arr[i] needs to be modified.
i.e. arr[i] = (arr[i – 1] + arr[i + 1]) / 2. If after modification, arr[i] = arr[i – 1] or arr[i] = arr[i + 1] then the array cannot be made strictly increasing without affecting more than a single element. Else count all such modifications, if the count of modifications in the end is less than or equal to 1 then print “Yes” else print “No”.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
bool check( int arr[], int n)
{
int modify = 0;
if (arr[0] > arr[1]) {
arr[0] = arr[1] / 2;
modify++;
}
for ( int i = 1; i < n - 1; i++) {
if ((arr[i - 1] < arr[i] && arr[i + 1] < arr[i])
|| (arr[i - 1] > arr[i] && arr[i + 1] > arr[i])) {
arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
return false ;
modify++;
}
}
if (arr[n - 1] < arr[n - 2])
modify++;
if (modify > 1)
return false ;
return true ;
}
int main()
{
int arr[] = { 2, 4, 8, 6, 9, 12 };
int n = sizeof (arr) / sizeof (arr[0]);
if (check(arr, n))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
|
Java
class GFG {
static boolean check( int arr[], int n)
{
int modify = 0 ;
if (arr[ 0 ] > arr[ 1 ]) {
arr[ 0 ] = arr[ 1 ] / 2 ;
modify++;
}
for ( int i = 1 ; i < n - 1 ; i++) {
if ((arr[i - 1 ] < arr[i] && arr[i + 1 ] < arr[i])
|| (arr[i - 1 ] > arr[i] && arr[i + 1 ] > arr[i])) {
arr[i] = (arr[i - 1 ] + arr[i + 1 ]) / 2 ;
if (arr[i] == arr[i - 1 ] || arr[i] == arr[i + 1 ])
return false ;
modify++;
}
}
if (arr[n - 1 ] < arr[n - 2 ])
modify++;
if (modify > 1 )
return false ;
return true ;
}
public static void main(String[] args)
{
int [] arr = { 2 , 4 , 8 , 6 , 9 , 12 };
int n = arr.length;
if (check(arr, n))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
C#
using System;
class GFG
{
static bool check( int []arr, int n)
{
int modify = 0;
if (arr[0] > arr[1])
{
arr[0] = arr[1] / 2;
modify++;
}
for ( int i = 1; i < n - 1; i++)
{
if ((arr[i - 1] < arr[i] && arr[i + 1] < arr[i])
|| (arr[i - 1] > arr[i] && arr[i + 1] > arr[i]))
{
arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
return false ;
modify++;
}
}
if (arr[n - 1] < arr[n - 2])
modify++;
if (modify > 1)
return false ;
return true ;
}
public static void Main()
{
int [] arr = { 2, 4, 8, 6, 9, 12 };
int n = arr.Length;
if (check(arr, n))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
Python 3
def check( arr, n):
modify = 0
if (arr[ 0 ] > arr[ 1 ]) :
arr[ 0 ] = arr[ 1 ] / / 2
modify + = 1
for i in range ( 1 , n - 1 ):
if ((arr[i - 1 ] < arr[i] and arr[i + 1 ] < arr[i])
or (arr[i - 1 ] > arr[i] and arr[i + 1 ] > arr[i])):
arr[i] = (arr[i - 1 ] + arr[i + 1 ]) / / 2
if (arr[i] = = arr[i - 1 ] or arr[i] = = arr[i + 1 ]):
return False
modify + = 1
if (arr[n - 1 ] < arr[n - 2 ]):
modify + = 1
if (modify > 1 ):
return False
return True
if __name__ = = "__main__" :
arr = [ 2 , 4 , 8 , 6 , 9 , 12 ]
n = len (arr)
if (check(arr, n)):
print ( "Yes" )
else :
print ( "No" )
|
Javascript
<script>
function check(arr, n)
{
var modify = 0;
if (arr[0] > arr[1]) {
arr[0] = arr[1] / 2;
modify++;
}
for ( var i = 1; i < n - 1; i++) {
if ((arr[i - 1] < arr[i] && arr[i + 1] < arr[i])
|| (arr[i - 1] > arr[i] && arr[i + 1] > arr[i])) {
arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
return false ;
modify++;
}
}
if (arr[n - 1] < arr[n - 2])
modify++;
if (modify > 1)
return false ;
return true ;
}
var arr = [ 2, 4, 8, 6, 9, 12 ];
var n = arr.length;
if (check(arr, n))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...