Maximice las particiones que, si se ordenan individualmente, hacen que se ordene toda la array

Dada una array arr[] . La tarea es dividir arr[] en el número máximo de particiones, de modo que esas particiones, si se ordenan individualmente, hacen que se ordene toda la array.

Ejemplos:

Entrada: arr[] = { 28, 9, 18, 32, 60, 50, 75, 70 }
Salida: 4
Explicación: Las siguientes son las particiones en las que se divide la array. 
Si dividimos arr[] en cuatro particiones {28, 9, 18}, {32}, {60, 50} y {75, 70}, ordénelas y concatene. 
Clasificarlos todos individualmente hace que se ordene toda la array. 
Por lo tanto, 4 es la respuesta.

Entrada: arr[] = { 2, 1, 0, 3, 4, 5 }
Salida: 4

 

Enfoque: Este problema está basado en la implementación. Siga los pasos a continuación para resolver el problema dado.  

  • Cree una array máxima que calcule el elemento máximo a la izquierda hasta ese índice de la array.
  • Cree una array mínima que calcule el elemento mínimo a la derecha hasta ese índice de la array.
  • Iterar a través de la array, cada vez que todos los elementos a la izquierdaMax[] son ​​más pequeños (o iguales) a todos los elementos a la derechaMax[] , eso significa que hay un nuevo fragmento, así que incremente el conteo en 1 .
  • Devuelve count+1 como respuesta final.

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

C++

// C++ program for above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find maximum partitions.
int maxPartitions(vector<int>& arr)
{
    int N = arr.size();
 
    // To keep track of max
    // and min elements at every index
    vector<int> leftMax(arr.size());
    vector<int> rightMin(arr.size());
 
    leftMax[0] = arr[0];
 
    for (int i = 1; i < N; i++) {
        leftMax[i] = max(leftMax[i - 1],
                         arr[i]);
    }
 
    rightMin[N - 1] = arr[N - 1];
 
    for (int i = N - 2; i >= 0; i--) {
        rightMin[i] = min(rightMin[i + 1],
                          arr[i]);
    }
 
    int count = 0;
 
    for (int i = 0; i < N - 1; i++) {
        if (leftMax[i] <= rightMin[i + 1]) {
            count++;
        }
    }
 
    // Return count + 1 as the final answer
    return count + 1;
}
 
// Driver code
int main()
{
    vector<int> arr{ 10, 0, 21, 32, 68 };
 
    cout << maxPartitions(arr);
    return 0;
}

Java

// Java implementation of the above approach
import java.util.*;
public class GFG {
 
  // Function to find maximum partitions.
  static int maxPartitions(int[] arr)
  {
    int N = arr.length;
 
    // To keep track of max
    // and min elements at every index
    int[] leftMax = new int[arr.length];
    int[] rightMin = new int[arr.length];
 
    leftMax[0] = arr[0];
 
    for (int i = 1; i < N; i++) {
      leftMax[i] = Math.max(leftMax[i - 1], arr[i]);
    }
 
    rightMin[N - 1] = arr[N - 1];
 
    for (int i = N - 2; i >= 0; i--) {
      rightMin[i] = Math.min(rightMin[i + 1], arr[i]);
    }
 
    int count = 0;
 
    for (int i = 0; i < N - 1; i++) {
      if (leftMax[i] <= rightMin[i + 1]) {
        count++;
      }
    }
 
    // Return count + 1 as the final answer
    return count + 1;
  }
 
  // Driver code
  public static void main(String args[])
  {
    int[] arr = { 10, 0, 21, 32, 68 };
 
    System.out.println(maxPartitions(arr));
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Python

# Python program for above approach
 
# Function to find maximum partitions.
def maxPartitions(arr):
    N = len(arr)
 
    # To keep track of max
    # and min elements at every index
    leftMax = []
    rightMin = []
 
    leftMax.append(arr[0])
 
    for i in range(1, N):
        leftMax.append(max(leftMax[i - 1], arr[i]))
 
    rightMin.append(arr[N - 1])
 
    for i in range(1, N):
        rightMin.append(min(rightMin[i - 1], arr[N - i - 1]))
    rightMin.reverse()
    count = 0
 
    for i in range(0, N - 1):
        if (leftMax[i] <= rightMin[i + 1]):
            count = count + 1
 
    # Return count + 1 as the final answer
    return count + 1
 
# Driver code
arr = [10, 0, 21, 32, 68]
print(maxPartitions(arr))
 
# This code is contributed by Samim Hossain Mondal.

C#

// C# program for above approach
using System;
class GFG {
 
  // Function to find maximum partitions.
  static int maxPartitions(int[] arr)
  {
    int N = arr.Length;
 
    // To keep track of max
    // and min elements at every index
    int[] leftMax = new int[arr.Length];
    int[] rightMin = new int[arr.Length];
 
    leftMax[0] = arr[0];
 
    for (int i = 1; i < N; i++) {
      leftMax[i] = Math.Max(leftMax[i - 1], arr[i]);
    }
 
    rightMin[N - 1] = arr[N - 1];
 
    for (int i = N - 2; i >= 0; i--) {
      rightMin[i] = Math.Min(rightMin[i + 1], arr[i]);
    }
 
    int count = 0;
 
    for (int i = 0; i < N - 1; i++) {
      if (leftMax[i] <= rightMin[i + 1]) {
        count++;
      }
    }
 
    // Return count + 1 as the final answer
    return count + 1;
  }
 
  // Driver code
  public static void Main()
  {
    int[] arr = { 10, 0, 21, 32, 68 };
 
    Console.WriteLine(maxPartitions(arr));
  }
}
 
// This code is contributed by ukasp.

Javascript

<script>
       // JavaScript code for the above approach
 
       // Function to find maximum partitions.
       function maxPartitions(arr)
       {
           let N = arr.length;
 
           // To keep track of max
           // and min elements at every index
           let leftMax = new Array(arr.length);
           let rightMin = new Array(arr.length);
 
           leftMax[0] = arr[0];
 
           for (let i = 1; i < N; i++) {
               leftMax[i] = Math.max(leftMax[i - 1],
                   arr[i]);
           }
 
           rightMin[N - 1] = arr[N - 1];
 
           for (let i = N - 2; i >= 0; i--) {
               rightMin[i] = Math.min(rightMin[i + 1],
                   arr[i]);
           }
 
           let count = 0;
 
           for (let i = 0; i < N - 1; i++) {
               if (leftMax[i] <= rightMin[i + 1]) {
                   count++;
               }
           }
 
           // Return count + 1 as the final answer
           return count + 1;
       }
 
       // Driver code
       let arr = [10, 0, 21, 32, 68];
       document.write(maxPartitions(arr));
 
        // This code is contributed by Potta Lokesh
   </script>
Producción

4

Complejidad temporal : O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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