Dada una array binaria arr[] de tamaño N , la tarea es verificar si la array arr[] se puede ordenar eliminando cualquier subsecuencia de elementos de array no adyacentes. Si la array se puede ordenar, imprima «Sí» . De lo contrario, escriba “No” .
Ejemplos:
Entrada: arr[] = {1, 0, 1, 0, 1, 1, 0}
Salida: Sí
Explicación:
Eliminar el elemento en los índices {1, 3, 6} modifica la array dada a {1, 1, 1, 1}, que está ordenado. Por lo tanto, imprima Sí.Entrada: arr[] = {0, 1, 1, 0, 0}
Salida: No
Enfoque ingenuo: el enfoque más simple para resolver el problema dado es generar todas las subsecuencias posibles de elementos no adyacentes y si existe alguna subsecuencia cuya eliminación ordena la array dada , entonces imprime «Sí» . De lo contrario, escriba “No” .
Complejidad temporal: O(2 N )
Espacio auxiliar: O(1)
Enfoque eficiente: el enfoque anterior también se puede optimizar en función de la observación de que la array no se puede ordenar si y solo si cuando existen dos 1 consecutivos presentes en índices adyacentes i e i + 1 y dos 0 consecutivos están presentes en índices adyacentes . indexa j y j + 1 tales que (j > i) . Siga los pasos a continuación para resolver el problema:
- Inicialice una variable, digamos idx como -1 que almacena el índice si hay dos 1 consecutivos en la array .
- Recorra la array dada y si existen dos 1 consecutivos presentes en la array, almacene ese índice en la variable idx y salga del bucle . De lo contrario, elimine todos los 1 de la array y ordene la array e imprima «Sí» .
- Si el valor de idx es «-1» , imprima «Sí» como siempre, al eliminar todos los 1 de la array, la array se ordena.
- De lo contrario, recorra la array nuevamente desde el índice idx y si existen dos 0 consecutivos , luego imprima y salga del bucle . De lo contrario, elimine todos los 0 de la array y ordene la array e imprima «Sí» .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to check if it is possible // to sort the array or not void isPossibleToSort(int arr[], int N) { // Stores the index if there are two // consecutive 1's in the array int idx = -1; // Traverse the given array for (int i = 1; i < N; i++) { // Check adjacent same elements // having values 1s if (arr[i] == 1 && arr[i - 1] == 1) { idx = i; break; } } // If there are no two consecutive // 1s, then always remove all the // 1s from array & make it sorted if (idx == -1) { cout << "YES"; return; } for (int i = idx + 1; i < N; i++) { // If two consecutive 0's are // present after two consecutive // 1's then array can't be sorted if (arr[i] == 0 && arr[i - 1] == 0) { cout << "NO"; return; } } // Otherwise, print Yes cout << "YES"; } // Driver Code int main() { int arr[] = { 1, 0, 1, 0, 1, 1, 0 }; int N = sizeof(arr) / sizeof(arr[0]); isPossibleToSort(arr, N); return 0; }
Java
// Java program for the above approach import java.io.*; import java.lang.*; import java.util.*; public class GFG { // Function to check if it is possible // to sort the array or not static void isPossibleToSort(int arr[], int N) { // Stores the index if there are two // consecutive 1's in the array int idx = -1; // Traverse the given array for (int i = 1; i < N; i++) { // Check adjacent same elements // having values 1s if (arr[i] == 1 && arr[i - 1] == 1) { idx = i; break; } } // If there are no two consecutive // 1s, then always remove all the // 1s from array & make it sorted if (idx == -1) { System.out.println("YES"); return; } for (int i = idx + 1; i < N; i++) { // If two consecutive 0's are // present after two consecutive // 1's then array can't be sorted if (arr[i] == 0 && arr[i - 1] == 0) { System.out.println("NO"); return; } } // Otherwise, print Yes System.out.println("YES"); } // Driver Code public static void main(String[] args) { int arr[] = { 1, 0, 1, 0, 1, 1, 0 }; int N = arr.length; isPossibleToSort(arr, N); } } // This code is contributed by Kingash.
Python3
# Python3 program for the above approach # Function to check if it is possible # to sort the array or not def isPossibleToSort(arr, N): # Stores the index if there are two # consecutive 1's in the array idx = -1 # Traverse the given array for i in range(1, N): # Check adjacent same elements # having values 1s if (arr[i] == 1 and arr[i - 1] == 1): idx = i break # If there are no two consecutive # 1s, then always remove all the # 1s from array & make it sorted if (idx == -1): print("YES") return for i in range(idx + 1, N, 1): # If two consecutive 0's are # present after two consecutive # 1's then array can't be sorted if (arr[i] == 0 and arr[i - 1] == 0): print("NO") return # Otherwise, print Yes print("YES") # Driver Code if __name__ == '__main__': arr = [ 1, 0, 1, 0, 1, 1, 0 ] N = len(arr) isPossibleToSort(arr, N) # This code is contributed by SURENDRA_GANGWAR
C#
// C# for the above approach using System.IO; using System; class GFG{ // Function to check if it is possible // to sort the array or not static void isPossibleToSort(int[] arr, int N) { // Stores the index if there are two // consecutive 1's in the array int idx = -1; // Traverse the given array for(int i = 1; i < N; i++) { // Check adjacent same elements // having values 1s if (arr[i] == 1 && arr[i - 1] == 1) { idx = i; break; } } // If there are no two consecutive // 1s, then always remove all the // 1s from array & make it sorted if (idx == -1) { Console.WriteLine("YES"); return; } for(int i = idx + 1; i < N; i++) { // If two consecutive 0's are // present after two consecutive // 1's then array can't be sorted if (arr[i] == 0 && arr[i - 1] == 0) { Console.WriteLine("NO"); return; } } // Otherwise, print Yes Console.WriteLine("YES"); } // Driver code static void Main() { int[] arr = { 1, 0, 1, 0, 1, 1, 0 }; int N = arr.Length; isPossibleToSort(arr, N); } } // This code is contributed by abhinavjain194
Javascript
<script> // JavaScript program for the above approach // Function to check if it is possible // to sort the array or not function isPossibleToSort(arr, N) { // Stores the index if there are two // consecutive 1's in the array var idx = -1; var i; // Traverse the given array for (i = 1; i < N; i++) { // Check adjacent same elements // having values 1s if (arr[i] == 1 && arr[i - 1] == 1) { idx = i; break; } } // If there are no two consecutive // 1s, then always remove all the // 1s from array & make it sorted if (idx == -1) { document.write("YES"); return; } for (i = idx + 1; i < N; i++) { // If two consecutive 0's are // present after two consecutive // 1's then array can't be sorted if (arr[i] == 0 && arr[i - 1] == 0) { document.write("NO"); return; } } // Otherwise, print Yes document.write("YES"); } // Driver Code var arr = [1, 0, 1, 0, 1, 1, 0]; var N = arr.length; isPossibleToSort(arr, N); </script>
YES
Complejidad temporal: O(N)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por shekabhi1208 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA