Skip to content
Related Articles

Related Articles

Check whether an array can be made strictly increasing by modifying atmost one element
  • Difficulty Level : Medium
  • Last Updated : 31 May, 2019

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <iostream>
using namespace std;
  
// Function that returns true if arr[]
// can be made strictly increasing after
// modifying at most one element
bool check(int arr[], int n)
{
    // To store the number of modifications
    // required to make the array
    // strictly increasing
    int modify = 0;
  
    // Check whether the first element needs
    // to be modify or not
    if (arr[0] > arr[1]) {
        arr[0] = arr[1] / 2;
        modify++;
    }
  
    // Loop from 2nd element to the 2nd last element
    for (int i = 1; i < n - 1; i++) {
  
        // Check whether arr[i] needs to be modified
        if ((arr[i - 1] < arr[i] && arr[i + 1] < arr[i])
            || (arr[i - 1] > arr[i] && arr[i + 1] > arr[i])) {
  
            // Modifying arr[i]
            arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
  
            // Check if arr[i] is equal to any of
            // arr[i-1] or arr[i+1]
            if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
                return false;
  
            modify++;
        }
    }
  
    // Check whether the last element needs
    // to be modify or not
    if (arr[n - 1] < arr[n - 2])
        modify++;
  
    // If more than 1 modification is required
    if (modify > 1)
        return false;
  
    return true;
}
  
// Driver code
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG {
  
    // Function that returns true if arr[]
    // can be made strictly increasing after
    // modifying at most one element
    static boolean check(int arr[], int n)
    {
        // To store the number of modifications
        // required to make the array
        // strictly increasing
        int modify = 0;
  
        // Check whether the first element needs
        // to be modify or not
        if (arr[0] > arr[1]) {
            arr[0] = arr[1] / 2;
            modify++;
        }
  
        // Loop from 2nd element to the 2nd last element
        for (int i = 1; i < n - 1; i++) {
  
            // Check whether arr[i] needs to be modified
            if ((arr[i - 1] < arr[i] && arr[i + 1] < arr[i])
                || (arr[i - 1] > arr[i] && arr[i + 1] > arr[i])) {
  
                // Modifying arr[i]
                arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
  
                // Check if arr[i] is equal to any of
                // arr[i-1] or arr[i+1]
                if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
                    return false;
  
                modify++;
            }
        }
  
        // Check whether the last element needs
        // to be modify or not
        if (arr[n - 1] < arr[n - 2])
            modify++;
  
        // If more than 1 modification is required
        if (modify > 1)
            return false;
  
        return true;
    }
  
    // Driver code
    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");
    }
}

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
  
class GFG
  
    // Function that returns true if arr[] 
    // can be made strictly increasing after 
    // modifying at most one element 
    static bool check(int []arr, int n) 
    
        // To store the number of modifications 
        // required to make the array 
        // strictly increasing 
        int modify = 0; 
  
        // Check whether the first element needs 
        // to be modify or not 
        if (arr[0] > arr[1]) 
        
            arr[0] = arr[1] / 2; 
            modify++; 
        
  
        // Loop from 2nd element to the 2nd last element 
        for (int i = 1; i < n - 1; i++) 
        
  
            // Check whether arr[i] needs to be modified 
            if ((arr[i - 1] < arr[i] && arr[i + 1] < arr[i]) 
                || (arr[i - 1] > arr[i] && arr[i + 1] > arr[i])) 
            
  
                // Modifying arr[i] 
                arr[i] = (arr[i - 1] + arr[i + 1]) / 2; 
  
                // Check if arr[i] is equal to any of 
                // arr[i-1] or arr[i+1] 
                if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1]) 
                    return false
  
                modify++; 
            
        
  
        // Check whether the last element needs 
        // to be modify or not 
        if (arr[n - 1] < arr[n - 2]) 
            modify++; 
  
        // If more than 1 modification is required 
        if (modify > 1) 
            return false
  
        return true
    
  
    // Driver code 
    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"); 
    
  
// This code is contributed by AnkitRai01

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 implementation of above approach
  
# Function that returns true if arr[]
# can be made strictly increasing after
# modifying at most one element
def check( arr, n):
  
    # To store the number of modifications
    # required to make the array
    # strictly increasing
    modify = 0
  
    # Check whether the first element needs
    # to be modify or not
    if (arr[0] > arr[1]) :
        arr[0] = arr[1] // 2
        modify+=1
      
  
    # Loop from 2nd element to the 2nd last element
    for i in range ( 1, n - 1):
  
        # Check whether arr[i] needs to be modified
        if ((arr[i - 1] < arr[i] and arr[i + 1] < arr[i])
            or (arr[i - 1] > arr[i] and arr[i + 1] > arr[i])):
  
            # Modifying arr[i]
            arr[i] = (arr[i - 1] + arr[i + 1]) // 2
  
            # Check if arr[i] is equal to any of
            # arr[i-1] or arr[i+1]
            if (arr[i] == arr[i - 1] or arr[i] == arr[i + 1]):
                return False
  
            modify+=1
          
  
    # Check whether the last element needs
    # to be modify or not
    if (arr[n - 1] < arr[n - 2]):
        modify+=1
  
    # If more than 1 modification is required
    if (modify > 1):
        return False
  
    return True
  
# Driver code
if __name__ == "__main__":
    arr = [ 2, 4, 8, 6, 9, 12 ]
    n = len(arr)
  
    if (check(arr, n)):
        print ( "Yes")
    else:
        print ("No")
  
# This code is contributed by ChitraNayal    

chevron_right


Output:

Yes

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :