Compruebe si invertir una subarray hace que la array esté ordenada

Dada una array de n enteros distintos. La tarea es verificar si invertir cualquier subarreglo puede hacer que el arreglo se ordene o no. Si la array ya está ordenada o se puede ordenar invirtiendo cualquier subarreglo, imprima » «, de lo contrario, imprima » No «.
Ejemplos: 

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

Método 1: Fuerza bruta (O(n 3 ))
Considere cada subarreglo y verifique si al invertir el subarreglo se ordena todo el arreglo. En caso afirmativo, devuelva Verdadero. Si al invertir cualquiera de los subarreglos no se ordena el arreglo, devuelva Falso. Teniendo en cuenta que cada subarreglo tomará O(n 2 ), y para cada subarreglo, verificar si todo el arreglo se ordenará después de invertir el subarreglo en consideración tomará O(n). Por lo tanto, la complejidad global sería O(n 3 ).

Método 2: Clasificación ( O(n*log(n) )) 
La idea es comparar la array dada con su versión ordenada. Haga una copia de la array dada y ordénela. Ahora, encuentre el primer índice y el último índice en la array dada que no coincida con la array ordenada. Si no se encuentran dichos índices (la array dada ya estaba ordenada), devuelva True. De lo contrario, verifique si los elementos entre los índices encontrados están en orden decreciente, si es Sí, devuelva Verdadero; de lo contrario, devuelva Falso

si A continuación se muestra la implementación del enfoque anterior:

C++

// 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;
}

Java

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

# 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

C#

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

PHP

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

Javascript

<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>
Producción

Yes

Complejidad de tiempo: O(n*log(n) ).
Espacio Auxiliar: O(n).

Método 3: solución de tiempo lineal (O(n)) 
Observe que la respuesta será verdadera cuando la array ya esté ordenada o cuando la array consta de tres partes. La primera parte es un subarreglo creciente, luego un subarreglo decreciente y luego nuevamente un subarreglo creciente. Por lo tanto, debemos verificar que la array contenga elementos crecientes, luego algunos elementos decrecientes y luego elementos crecientes, si este es el caso, la respuesta será verdadera. En todos los demás casos, la respuesta será Falso.

Nota: simplemente encontrar las tres partes no garantiza que la respuesta sea verdadera, por ejemplo, considere

 arr [] = {10,20,30,40,4,3,2,50,60,70} 

La respuesta sería Falso en este caso aunque podemos encontrar tres partes. Manejaremos la validez de las tres partes en el código a continuación.

A continuación se muestra la implementación de este enfoque: 

C++

// 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 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;
}

Java

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

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

C#

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

Javascript

<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>
Producción

Yes

Complejidad temporal: O(n).
Espacio Auxiliar: O(1).

Este artículo es aportado por Anuj Chauhan y mejorado por Nakshatra Chhillar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *