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 » Sí «, 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>
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>
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