Check if reversing a sub array make the array sorted - GeeksforGeeks

13 Apr, 2021
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++
Java
Python3
C#
PHP
Javascript
// 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 Programint 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;}
// 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
# 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 codearr = [1, 2, 5, 4, 3]n = len(arr)if checkReverse(arr, n) == True:    print("Yes")else:    print("No") # This code is contributed# by Shrikant13
// C# program to check whether reversing a// sub array make the array sorted or notusing 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 Programpublic 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
<?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){    // Copying the array.    $temp[$n] = array();    for ($i = 0; $i < $n; $i++)        $temp[$i] = $arr[$i];     // Sort the copied array.    sort($temp, 0);     // Finding the first mismatch.    $front;    for ($front = 0; $front < $n; $front++)        if ($temp[$front] != $arr[$front])            break;     // Finding the last mismatch.    $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;} // 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?>
<script> // Javascript 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) {        // Copying the array.        let temp = [];        for (let i = 0; i < n; i++) {            temp[i] = arr[i];        }         // Sort the copied array.        temp.sort();         // Finding the first mismatch.        let front;        for (front = 0; front < n; front++) {            if (temp[front] != arr[front]) {                break;            }        }         // Finding the last mismatch.        let 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;    } // Driver Code     let arr = [1, 2, 5, 4, 3];    let n = arr.length;     if (checkReverse(arr, n)) {        document.write("Yes");    } else {        document.write("No");    } </script>
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++
Java
Python3
C#
PHP
Javascript
// 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 (j < n && 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 Programint 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;}
// 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 (j < n && 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
# Python3 program to check whether reversing# a sub array make the array sorted or notimport 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                  else:            break     # Find reversed part    j = i    while (j < n and 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 Codearr = [ 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
// 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 (j < n && 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
<?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)?>
<script> // Javascript program to check whether reversing a sub array// make the array sorted or not // Return true, if reversing the subarray will sort t// he array, else return false.function checkReverse( arr, n){    if (n == 1)        return true;     // Find first increasing part    let i;    for (i=1; i < n && arr[i-1] < arr[i]; i++);    if (i == n)        return true;     // Find reversed part    let j = i;    while (j < n && 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    let 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 program             let arr = [1, 3, 4, 10, 9, 8];        let n = arr.length;          if (checkReverse(arr, n)) {            document.write("Yes");        } else {            document.write("No");        }          </script>
Output: 
Yes
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. 
shrikanth13
Akanksha_Rai
29AjayKumar
princiraj1992
Rajput-Ji
mohit kumar 29
nikhilaggarwal3
code_hunt
jana_sayantan
Searching
Sorting
Searching
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Given an array of size n and a number k, find all elements that appear more than n/k times
Program to find largest element in an array
k largest(or smallest) elements in an array
Search an element in a sorted and rotated array
Median of two sorted arrays of different sizes