Compruebe si es posible ordenar la array después de rotarla

Dada una array de tamaño N, la tarea es determinar si es posible ordenar la array o no con solo una mezcla. En una mezcla, podemos mover algunos elementos contiguos desde el final de la array y colocarlos al frente de la array.
Por ejemplo: 
 

  1. A = {2, 3, 1, 2}, podemos desplazar {1, 2} desde el final del arreglo al frente del arreglo para ordenarlo.
  2. A = {1, 2, 3, 2} ya que no podemos ordenarlo de una sola vez, por lo tanto, no es posible ordenar la array.

Ejemplos: 
 

Input: arr[] = {1, 2, 3, 4} 
Output: Possible 
Since this array is already sorted hence no need for shuffle.

Input: arr[] = {6, 8, 1, 2, 5}
Output: Possible
Place last three elements at the front 
in the same order i.e. {1, 2, 5, 6, 8}

Acercarse: 
 

  1. Compruebe si la array ya está ordenada o no. Si es así, devuelve verdadero.
  2. De lo contrario, comience a recorrer los elementos de la array hasta que el elemento actual sea más pequeño que el siguiente. Almacene ese índice donde arr[i] > arr[i+1].
  3. Recorra desde ese punto y verifique si los elementos de ese índice están en orden creciente o no.
  4. Si se cumplen las dos condiciones anteriores, compruebe si el último elemento es menor o igual que el primer elemento de la array dada.
  5. Escriba «Posible» si se cumplen las tres condiciones anteriores; de lo contrario, escriba «No es posible» si falla alguna de las 3 condiciones anteriores.

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

C++

// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if it is possible
bool isPossible(int a[], int n)
{
    // step 1
    if (is_sorted(a, a + n)) {
        cout << "Possible" << endl;
    }
 
    else {
 
        // break where a[i] > a[i+1]
        bool flag = true;
        int i;
        for (i = 0; i < n - 1; i++) {
            if (a[i] > a[i + 1]) {
                break;
            }
        }
        // break point + 1
        i++;
 
        // check whether the sequence is
        // further increasing or not
        for (int k = i; k < n - 1; k++) {
            if (a[k] > a[k + 1]) {
                flag = false;
                break;
            }
        }
 
        // If not increasing after break point
        if (!flag)
            return false;
 
        else {
 
            // last element <= First element
            if (a[n - 1] <= a[0])
                return true;
 
            else
                return false;
        }
    }
}
 
// Driver code
int main()
{
 
    int arr[] = { 3, 1, 2, 2, 3 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    if (isPossible(arr, n))
        cout << "Possible";
 
    else
        cout << "Not Possible";
 
    return 0;
}

Java

// Java implementation of above approach
class solution
{
    //check if array is sorted
static boolean is_sorted(int a[],int n)
{
    int c1=0,c2=0;
    //if array is ascending
    for(int i=0;i<n-1;i++)
    {
        if(a[i]<=a[i+1])
        c1++;
    }
     
    //if array is descending
    for(int i=1;i<n;i++)
    {
        if(a[i]<=a[i-1])
        c2++;
    }
    if(c1==n||c2==n)
    return true;
     
    return false;
}
// Function to check if it is possible
static boolean isPossible(int a[], int n)
{
    // step 1
    if (is_sorted(a,n)) {
        System.out.println("Possible");
    }
   
    else {
   
        // break where a[i] > a[i+1]
        boolean flag = true;
        int i;
        for (i = 0; i < n - 1; i++) {
            if (a[i] > a[i + 1]) {
                break;
            }
        }
        // break point + 1
        i++;
   
        // check whether the sequence is
        // further increasing or not
        for (int k = i; k < n - 1; k++) {
            if (a[k] > a[k + 1]) {
                flag = false;
                break;
            }
        }
   
        // If not increasing after break point
        if (!flag)
            return false;
   
        else {
   
            // last element <= First element
            if (a[n - 1] <= a[0])
                return true;
   
            else
                return false;
        }
    }
    return false;
}
   
// Driver code
public static void main(String[] args)
{
   
    int arr[] = { 3, 1, 2, 2, 3 };
    int n = arr.length;
   
    if (isPossible(arr, n))
        System.out.println("Possible");
   
    else
        System.out.println("Not Possible");
   
}
}
//contributed by Arnab Kundu

Python 3

# Python 3 implementation of
# above approach
def is_sorted(a):
    all(a[i] <= a[i + 1]
    for i in range(len(a) - 1))
     
# Function to check if
# it is possible
def isPossible(a, n):
 
    # step 1
    if (is_sorted(a)) :
        print("Possible")
     
    else :
 
        # break where a[i] > a[i+1]
        flag = True
        for i in range(n - 1) :
            if (a[i] > a[i + 1]) :
                break
             
        # break point + 1
        i += 1
 
        # check whether the sequence is
        # further increasing or not
        for k in range(i, n - 1) :
            if (a[k] > a[k + 1]) :
                flag = False
                break
 
        # If not increasing after
        # break point
        if (not flag):
            return False
 
        else :
 
            # last element <= First element
            if (a[n - 1] <= a[0]):
                return True
 
            else:
                return False
 
# Driver code
if __name__ == "__main__":
 
    arr = [ 3, 1, 2, 2, 3 ]
    n = len(arr)
 
    if (isPossible(arr, n)):
        print("Possible")
 
    else:
        print("Not Possible")
 
# This code is contributed
# by ChitraNayal

C#

// C# implementation of above approach
using System;
class GFG
{
// check if array is sorted
static bool is_sorted(int []a, int n)
{
    int c1 = 0, c2 = 0;
     
    // if array is ascending
    for(int i = 0; i < n - 1; i++)
    {
        if(a[i] <= a[i + 1])
        c1++;
    }
     
    // if array is descending
    for(int i = 1; i < n; i++)
    {
        if(a[i] <= a[i - 1])
        c2++;
    }
    if(c1 == n || c2 == n)
    return true;
     
    return false;
}
 
// Function to check if it is possible
static bool isPossible(int []a, int n)
{
    // step 1
    if (is_sorted(a,n))
    {
        Console.WriteLine("Possible");
    }
 
    else
    {
 
        // break where a[i] > a[i+1]
        bool flag = true;
        int i;
        for (i = 0; i < n - 1; i++)
        {
            if (a[i] > a[i + 1])
            {
                break;
            }
        }
         
        // break point + 1
        i++;
 
        // check whether the sequence is
        // further increasing or not
        for (int k = i; k < n - 1; k++)
        {
            if (a[k] > a[k + 1])
            {
                flag = false;
                break;
            }
        }
 
        // If not increasing after
        // break point
        if (!flag)
            return false;
 
        else
        {
 
            // last element <= First element
            if (a[n - 1] <= a[0])
                return true;
 
            else
                return false;
        }
    }
    return false;
}
 
// Driver code
public static void Main()
{
 
    int []arr = { 3, 1, 2, 2, 3 };
    int n = arr.Length;
 
    if (isPossible(arr, n))
        Console.WriteLine("Possible");
 
    else
        Console.WriteLine("Not Possible");
}
}
 
// This code is contributed by anuj_67

PHP

<?php
// PHP implementation of
// above approach
 
// Function to check if
// it is possible
function is_sorted($a, $n)
{
    $c1 = 0; $c2 = 0;
     
    // if array is ascending
    for($i = 0; $i < $n - 1; $i++)
    {
        if($a[$i] <= $a[$i + 1])
        $c1++;
    }
     
    // if array is descending
    for($i = 1; $i < $n; $i++)
    {
        if($a[$i] <= $a[$i - 1])
        $c2++;
    }
     
    if($c1 == $n || $c2 == $n)
    return true;
     
    return false;
}
 
function isPossible($a, $n)
{
    // step 1
    if (is_sorted($a, $n))
    {
        echo "Possible" . "\n";
    }
 
    else
    {
 
        // break where a[i] > a[i+1]
        $flag = true;
        $i;
        for ($i = 0; $i < $n - 1; $i++)
        {
            if ($a[$i] > $a[$i + 1])
            {
                break;
            }
        }
         
        // break point + 1
        $i++;
 
        // check whether the sequence is
        // further increasing or not
        for ($k = $i; $k < $n - 1; $k++)
        {
            if ($a[$k] > $a[$k + 1])
            {
                $flag = false;
                break;
            }
        }
 
        // If not increasing after
        // break point
        if (!$flag)
            return false;
 
        else
        {
 
            // last element <= First element
            if ($a[$n - 1] <= $a[0])
                return true;
 
            else
                return false;
        }
    }
}
 
// Driver code
$arr = array( 3, 1, 2, 2, 3 );
$n = sizeof($arr);
 
if (isPossible($arr, $n))
    echo "Possible";
else
    echo "Not Possible";
 
// This code is contributed
// by Akanksha Rai(Abby_akku)
?>

Javascript

<script>
// Javascript implementation of above approach 
// check if array is sorted
    function is_sorted(a)
    {
        let c1=0,c2=0;
        // if array is ascending
        for(let i=0;i<n-1;i++)
        {
            if(a[i]<=a[i+1])
            {
                c1++;
            }
        }
        // if array is descending
        for(let i=1;i<n;i++)
        {
            if(a[i]<=a[i-1])
                c2++;
        }
        if(c1==n||c2==n)
        {
            return true;
        }
        return false;
    }
    // Function to check if it is possible
    function isPossible(a,n)
    {
        // step 1
        if (is_sorted(a,n))
        {
            document.write("Possible");   
        }
        else
        {
            // break where a[i] > a[i+1]
            let flag = true;
            let i;
            for (i = 0; i < n - 1; i++)
            {
                if (a[i] > a[i + 1])
                {
                    break;
                }
            }
            // break point + 1 
            i++;
            // check whether the sequence is 
            // further increasing or not 
            for (let k = i; k < n - 1; k++)
            {
                if (a[k] > a[k + 1])
                {
                    flag = false; 
                    break;
                }
            }
            // If not increasing after break point 
            if (!flag) 
            {
                return false;
            }
            else
            {
                // last element <= First element 
                if (a[n - 1] <= a[0]) 
                    return true; 
     
                else
                    return false; 
            }
        }
             
        return false;
    }
    // Driver code 
    let arr=[3, 1, 2, 2, 3];
    let n = arr.length;
    if(isPossible(arr, n))
        document.write("Possible");
    else
        document.write("Not Possible");
         
    // This code is contributed by avanitrachhadiya2155
</script>
Producción: 

Possible

 

Complejidad de tiempo: O(n)

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por Shashank_Pathak 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 *