Check if reversing a sub array make the array sorted

Given an array of distinct n integers. The task is to check whether reversing one sub-array make the array sorted or not. If the array is already sorted or by reversing a subarray once make it sorted, print “Yes”, else print “No”.

Examples:

Input : arr [] = {1, 2, 5, 4, 3}
Output : Yes
By reversing the subarray {5, 4, 3}, 
the array will be sorted.

Input : arr [] = { 1, 2, 4, 5, 3 }
Output : No

Method 1 (Simple : O(n2)
A simple solution is to consider every subarray one by one. Try reversing every subarray and check if reversing the subarray makes the whole array sorted. If yes, return true. If reversing any subarray doesn’t make the array sorted, then return false.

 
Method 2 (Sorting : O(nlogn)):
The idea is to compare the given array with the sorted array. Make a copy of the given array and sort it. Now, find the first index and last index which do not match with sorted array. If no such indices are found, print “Yes”. Else check if the elements between the indices are in decreasing order.

Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to check whether reversing a
// sub array make the array sorted or not
#include<bits/stdc++.h>
using namespace std;
  
// Return true, if reversing the subarray will
// sort the array, else return false.
bool checkReverse(int arr[], int n)
{
    // Copying the array.
    int temp[n];
    for (int i = 0; i < n; i++)
        temp[i] = arr[i];
  
    // Sort the copied array.
    sort(temp, temp + n);
  
    // Finding the first mismatch.
    int front;
    for (front = 0; front < n; front++)
        if (temp[front] != arr[front])
            break;
  
    // Finding the last mismatch.
    int back;
    for (back = n - 1; back >= 0; back--)
        if (temp[back] != arr[back])
            break;
  
    // If whole array is sorted
    if (front >= back)
        return true;
  
    // Checking subarray is decreasing or not.
    do
    {
        front++;
        if (arr[front - 1] < arr[front])
            return false;
    } while (front != back);
  
    return true;
}
  
// Driven Program
int main()
{
    int arr[] = { 1, 2, 5, 4, 3 };
    int n = sizeof(arr)/sizeof(arr[0]);
  
    checkReverse(arr, n)? (cout << "Yes" << endl):
                          (cout << "No" << endl);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to check whether reversing a 
// sub array make the array sorted or not
  
import java.util.Arrays;
  
class GFG {
  
// Return true, if reversing the subarray will 
// sort the array, else return false. 
    static boolean checkReverse(int arr[], int n) {
        // Copying the array. 
        int temp[] = new int[n];
        for (int i = 0; i < n; i++) {
            temp[i] = arr[i];
        }
  
        // Sort the copied array. 
        Arrays.sort(temp);
  
        // Finding the first mismatch. 
        int front;
        for (front = 0; front < n; front++) {
            if (temp[front] != arr[front]) {
                break;
            }
        }
  
        // Finding the last mismatch. 
        int back;
        for (back = n - 1; back >= 0; back--) {
            if (temp[back] != arr[back]) {
                break;
            }
        }
  
        // If whole array is sorted 
        if (front >= back) {
            return true;
        }
  
        // Checking subarray is decreasing or not. 
        do {
            front++;
            if (arr[front - 1] < arr[front]) {
                return false;
            }
        } while (front != back);
  
        return true;
    }
  
// Driven Program 
    public static void main(String[] args) {
  
        int arr[] = {1, 2, 5, 4, 3};
        int n = arr.length;
  
        if (checkReverse(arr, n)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
  
}
//This code contributed by 29AjayKumar 

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to check whether 
# reversing a sub array make the
# array sorted or not
  
# Return true, if reversing the 
# subarray will sort the array, 
# else return false. 
def checkReverse(arr, n):
  
    # Copying the array
    temp = [0] * n
    for i in range(n):
        temp[i] = arr[i]
  
    # Sort the copied array. 
    temp.sort()
  
    # Finding the first mismatch. 
    for front in range(n):
        if temp[front] != arr[front]:
            break
  
    # Finding the last mismatch. 
    for back in range(n - 1, -1, -1):
        if temp[back] != arr[back]:
            break
  
    #If whole array is sorted
    if front >= back:
        return True
    while front != back:
        front += 1
        if arr[front - 1] < arr[front]:
            return False
    return True
  
# Driver code
arr = [1, 2, 5, 4, 3]
n = len(arr)
if checkReverse(arr, n) == True:
    print("Yes")
else:
    print("No")
  
# This code is contributed 
# by Shrikant13

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to check whether reversing a 
// sub array make the array sorted or not
using System;
  
class GFG
{
  
// Return true, if reversing the 
// subarray will sort the array,
// else return false. 
static bool checkReverse(int []arr, int n) 
{
    // Copying the array. 
    int []temp = new int[n];
    for (int i = 0; i < n; i++) 
    {
        temp[i] = arr[i];
    }
  
    // Sort the copied array. 
    Array.Sort(temp);
  
    // Finding the first mismatch. 
    int front;
    for (front = 0; front < n; front++)
    {
        if (temp[front] != arr[front])
        {
            break;
        }
    }
  
    // Finding the last mismatch. 
    int back;
    for (back = n - 1; back >= 0; back--) 
    {
        if (temp[back] != arr[back])
        {
            break;
        }
    }
  
    // If whole array is sorted 
    if (front >= back)
    {
        return true;
    }
  
    // Checking subarray is decreasing
    // or not. 
    do 
    {
        front++;
        if (arr[front - 1] < arr[front])
        {
            return false;
        }
    } while (front != back);
  
    return true;
}
  
// Driven Program 
public static void Main() 
{
    int []arr = {1, 2, 5, 4, 3};
    int n = arr.Length;
  
    if (checkReverse(arr, n)) 
    {
        Console.Write("Yes");
    
    else 
    {
        Console.Write("No");
    }
}
}
  
// This code is contributed
// by PrinciRaj

chevron_right


PHP

= 0; $back–)
if ($temp[$back] != $arr[$back])
break;

// If whole array is sorted
if ($front >= $back)
return true;

// Checking subarray is decreasing or not.
do
{
$front++;
if ($arr[$front – 1] < $arr[$front]) return false; } while ($front != $back); return true; } // Driver Code $arr = array( 1, 2, 5, 4, 3 ); $n = sizeof($arr); if(checkReverse($arr, $n)) echo "Yes" . "\n"; else echo "No" . "\n"; // This code is contributed // by Akanksha Rai ?>


Output:

Yes

Time Complexity: O(nlogn).

 
Method 3 (Linear : O(n)):
Observe, answer will be “Yes” when the array is sorted or when the array consist of three parts. First part is increasing subarray, then decreasing subarray and then again increasing subarray. So, we need to check that array contain increasing elements then some decreasing elements and then increasing elements. In all other case, answer will be “No”.

Below is the implementation of this approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to check whether reversing a sub array
// make the array sorted or not
#include<bits/stdc++.h>
using namespace std;
  
// Return true, if reversing the subarray will sort t
// he array, else return false.
bool checkReverse(int arr[], int n)
{
    if (n == 1)
        return true;
  
    // Find first increasing part
    int i;
    for (i=1; i < n && arr[i-1] < arr[i]; i++);
    if (i == n)
        return true;
  
    // Find reversed part
    int j = i;
    while (arr[j] < arr[j-1])
    {
        if (i > 1 && arr[j] < arr[i-2])
            return false;
        j++;
    }
  
    if (j == n)
        return true;
  
    // Find last increasing part
    int k = j;
  
    // To handle cases like {1,2,3,4,20,9,16,17}
    if (arr[k] < arr[i-1])
       return false;
  
    while (k > 1 && k < n)
    {
        if (arr[k] < arr[k-1])
            return false;
        k++;
    }
    return true;
}
  
// Driven Program
int main()
{
    int arr[] = {1, 3, 4, 10, 9, 8};
    int n = sizeof(arr)/sizeof(arr[0]);
    checkReverse(arr, n)? cout << "Yes" : cout << "No";
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to check whether reversing a sub array 
// make the array sorted or not
  
class GFG {
  
// Return true, if reversing the subarray will sort t 
// he array, else return false. 
    static boolean checkReverse(int arr[], int n) {
        if (n == 1) {
            return true;
        }
  
        // Find first increasing part 
        int i;
        for (i = 1; arr[i - 1] < arr[i] && i < n; i++);
        if (i == n) {
            return true;
        }
  
        // Find reversed part 
        int j = i++;
        while (arr[j] < arr[j - 1]) {
            if (i > 1 && arr[j] < arr[i - 2]) {
                return false;
            }
            j++;
        }
  
        if (j == n) {
            return true;
        }
  
        // Find last increasing part 
        int k = j;
  
        // To handle cases like {1,2,3,4,20,9,16,17} 
        if (arr[k] < arr[i - 1]) {
            return false;
        }
  
        while (k > 1 && k < n) {
            if (arr[k] < arr[k - 1]) {
                return false;
            }
            k++;
        }
        return true;
    }
  
// Driven Program 
    public static void main(String[] args) {
  
        int arr[] = {1, 3, 4, 10, 9, 8};
        int n = arr.length;
  
        if (checkReverse(arr, n)) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
  
}
  
// This code is contributed
// by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to check whether reversing 
# a sub array make the array sorted or not
import math as mt
  
# Return True, if reversing the subarray 
# will sort the array, else return False.
def checkReverse(arr, n):
  
    if (n == 1):
        return True
  
    # Find first increasing part
    i = 1
    for i in range(1, n):
        if arr[i - 1] < arr[i] :
            if (i == n):
                return True
  
    # Find reversed part
    j = i
    while (arr[j] < arr[j - 1]):
       
        if (i > 1 and arr[j] < arr[i - 2]):
            return False
        j += 1
  
    if (j == n):
        return True
  
    # Find last increasing part
    k = j
  
    # To handle cases like 1,2,3,4,20,9,16,17
    if (arr[k] < arr[i - 1]):
        return False
  
    while (k > 1 and k < n):
      
        if (arr[k] < arr[k - 1]):
            return False
        k += 1
      
    return True
  
# Driver Code
arr = [ 1, 3, 4, 10, 9, 8]
n = len(arr)
if checkReverse(arr, n):
    print("Yes")
else:
    print("No")
          
# This code is contributed by 
# Mohit kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to check whether reversing a 
// sub array make the array sorted or not
   
using System;
public class GFG{
  
// Return true, if reversing the subarray will sort t 
// he array, else return false. 
    static bool checkReverse(int []arr, int n) {
        if (n == 1) {
            return true;
        }
  
        // Find first increasing part 
        int i;
        for (i = 1; arr[i - 1] < arr[i] && i < n; i++);
        if (i == n) {
            return true;
        }
  
        // Find reversed part 
        int j = i++;
        while (arr[j] < arr[j - 1]) {
            if (i > 1 && arr[j] < arr[i - 2]) {
                return false;
            }
            j++;
        }
  
        if (j == n) {
            return true;
        }
  
        // Find last increasing part 
        int k = j;
  
        // To handle cases like {1,2,3,4,20,9,16,17} 
        if (arr[k] < arr[i - 1]) {
            return false;
        }
  
        while (k > 1 && k < n) {
            if (arr[k] < arr[k - 1]) {
                return false;
            }
            k++;
        }
        return true;
    }
  
  
// Driven Program 
    public static void Main() {
  
        int []arr = {1, 3, 4, 10, 9, 8};
        int n = arr.Length;
  
        if (checkReverse(arr, n)) {
            Console.Write("Yes");
        } else {
            Console.Write("No");
        }
    }
}
// This code is contributed
// by 29AjayKumar

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to check whether reversing 
// a sub array make the array sorted or not
  
// Return true, if reversing the subarray 
// will sort the array, else return false.
function checkReverse($arr, $n)
{
    if ($n == 1)
        return true;
  
    // Find first increasing part
    for ($i = 1; 
         $i < $n && $arr[$i - 1] < $arr[$i]; 
         $i++);
    if ($i == $n)
        return true;
  
    // Find reversed part
    $j = $i;
    while ($arr[$j] < $arr[$j - 1])
    {
        if ($i > 1 && $arr[$j] < $arr[$i - 2])
            return false;
        $j++;
    }
  
    if ($j == $n)
        return true;
  
    // Find last increasing part
    $k = $j;
  
    // To handle cases like {1,2,3,4,20,9,16,17}
    if ($arr[$k] < $arr[$i - 1])
    return false;
  
    while ($k > 1 && $k < $n)
    {
        if ($arr[$k] < $arr[$k - 1])
            return false;
        $k++;
    }
    return true;
}
  
// Driver Code
$arr = array(1, 3, 4, 10, 9, 8);
$n = sizeof($arr);
if(checkReverse($arr, $n))
    echo "Yes";
else
    echo "No";
  
// This code is contributed
// by Akanksha Rai(Abby_akku)
?>

chevron_right



Output:

No

Time Complexity: O(n).

This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up



Article Tags :
Practice Tags :


2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.