Elementos de array máximos que se pueden eliminar junto con sus valores adyacentes para vaciar la array dada

Dada una array arr[] de tamaño N . En cada operación, elija un elemento de array X y elimine todos los elementos de array en el rango [X – 1, X + 1] . La tarea es encontrar el número máximo de pasos necesarios para que no queden monedas en la array.

Ejemplos:

Entrada: monedas [] = {5, 1, 3, 2, 6, 7, 4} 
Salida:
Explicación: 
Al elegir la moneda monedas [1], se modifica la array arr[] = {5, 3, 6, 7, 4 }. 
Escoger la moneda monedas[1] modifica el arreglo arr[] = {5, 6, 7} 
Escoger la moneda monedas[0] modifica el arreglo arr[] = {7} 
Escoger la moneda monedas[0] modifica el arreglo arr[ ] = {}. Por lo tanto, la salida requerida es 4.

Entrada: monedas [] = {6, 7, 5, 1} 
Salida: 3

Enfoque ingenuo: el enfoque más simple para resolver este problema es generar todas las permutaciones posibles de la array dada y, para cada permutación de la array, encontrar la cantidad de pasos necesarios para eliminar todos los elementos de la array seleccionando solo el primer elemento de la array. array en todos los pasos posibles. Finalmente, imprima el número máximo de pasos necesarios para eliminar todos los elementos.

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

Enfoque eficiente: para optimizar el enfoque anterior, la idea es elegir un elemento de la array de tal manera que en cada paso se eliminen como máximo dos elementos de la array. Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos cntSteps para almacenar la cantidad máxima de pasos necesarios para eliminar todas las monedas de la array arr[] .
  • Cree un mapa , diga Mapa para almacenar la frecuencia de los elementos de la array arr[] en orden ascendente.
  • Inicialice una variable, diga Min para almacenar el elemento más pequeño del Mapa .
  • Recorra el Mapa y en cada recorrido elimine el Min y (Min + 1) del Mapa y también incremente el valor de cntSteps en 1 .
  • Finalmente, imprima el valor de cntSteps .

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

C++

// C++ program to implement
// the above approach
  
#include <bits/stdc++.h>
using namespace std;
  
  
// Function to find maximum steps to
// remove all coins from the arr[]
int maximumSteps(int arr[], int N)
{
      
    // Store the frequency of array
    // elements in ascending order
    map<int, int> Map;
      
      
    // Traverse the arr[] array
    for (int i = 0; i < N; i++) {
        Map[arr[i]]++;
    }
      
      
    // Stores count of steps required
    // to remove all the array elements
    int cntSteps = 0;
      
      
    // Traverse the map
    for (auto i : Map) {
          
        // Stores the smallest element
        // of Map
        int X = i.first;
          
        // If frequency if X
        // greater than 0
        if (i.second > 0) {
              
            // Update cntSteps
            cntSteps++;
              
              
            // Mark X as
            // removed element
            Map[X] = 0;
             
             
            // If frequency of (X + 1)
            // greater than  0
            if (Map[X + 1])
                  
                  
                // Mark (X + 1) as
                // removed element
                Map[X + 1] = 0;
        }
    }
    return cntSteps;
}
  
  
// Driver Code
int main()
{
    int arr[] = { 5, 1, 3, 2, 6, 7, 4 };
    int N = sizeof(arr) / sizeof(arr[0]);
    cout << maximumSteps(arr, N);
    return 0;
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
     
// Function to find maximum steps to
// remove all coins from the arr[]
static int maximumSteps(int arr[], int N)
{
     
    // Store the frequency of array
    // elements in ascending order
    Map<Integer,
        Integer> mp = new HashMap<Integer,
                                  Integer>();
      
    // Traverse the arr[] array
    for(int i = 0; i < N; i++)
    {
        mp.put(arr[i],
               mp.getOrDefault(arr[i], 0) + 1);
    }
     
    // Stores count of steps required
    // to remove all the array elements
    int cntSteps = 0;
     
    // Traverse the mp
    for(Map.Entry<Integer, Integer> it : mp.entrySet())
    {
         
        // Stores the smallest element
        // of mp
        int X = it.getKey();
         
        // If frequency if X
        // greater than 0
        if (it.getValue() > 0)
        {
             
            // Update cntSteps
            cntSteps++;
             
            // Mark X as
            // removed element
            mp.replace(X, 0);
             
            // If frequency of (X + 1)
            // greater than  0
            if (mp.getOrDefault(X + 1, 0) != 0)
                  
                // Mark (X + 1) as
                // removed element
                mp.replace(X + 1, 0);
        }
    }
    return cntSteps;
}
  
// Driver Code
public static void main(String args[])
{
    int arr[] = { 5, 1, 3, 2, 6, 7, 4 };
    int N = arr.length;
     
    System.out.print(maximumSteps(arr, N));
}
}
  
// This code is contributed by ipg2016107

Python3

# Python3 program to implement
# the above approach
 
# Function to find maximum steps to
# remove all coins from the arr[]
def maximumSteps(arr, N):
     
    # Store the frequency of array
    # elements in ascending order
    Map = {}
     
    # Traverse the arr[] array
    for i in range(N):
        Map[arr[i]] = Map.get(arr[i], 0) + 1
         
    # Stores count of steps required
    # to remove all the array elements
    cntSteps = 0
 
    # Traverse the map
    for i in Map:
         
        # Stores the smallest element
        # of Map
        X = i
 
        # If frequency if X
        # greater than 0
        if (Map[i] > 0):
             
            # Update cntSteps
            cntSteps += 1
             
            # Mark X as
            # removed element
            Map[X] = 0
             
            # If frequency of (X + 1)
            # greater than  0
            if (X + 1 in Map):
                 
                # Mark (X + 1) as
                # removed element
                Map[X + 1] = 0
 
    return cntSteps
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 5, 1, 3, 2, 6, 7, 4 ]
    N = len(arr)
     
    print(maximumSteps(arr, N))
 
# This code is contributed by mohit kumar 29

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
 
class GFG{
     
// Function to find maximum steps to
// remove all coins from the []arr
static int maximumSteps(int []arr, int N)
{
   
    // Store the frequency of array
    // elements in ascending order
    Dictionary<int,
               int> mp = new Dictionary<int,
                                        int>();
      
    // Traverse the []arr array
    for(int i = 0; i < N; i++)
    {
        if (mp.ContainsKey(arr[i]))
        {
            mp[arr[i]]++;   
        }
        else
        {
            mp.Add(arr[i], 1);
        }
    }
     
    // Stores count of steps required
    // to remove all the array elements
    int cntSteps = 0;
      
    // Traverse the mp
    foreach(KeyValuePair<int, int> it in mp)
    {
         
        // Stores the smallest element
        // of mp
        int X = it.Key;
         
        // If frequency if X
        // greater than 0
        if (it.Value > 0)
        {
             
            // Update cntSteps
            cntSteps++;
          
        }
    }
    return (cntSteps + 1) / 2;
}
  
// Driver Code
public static void Main(String []args)
{
    int []arr = { 5, 1, 3, 2, 6, 7, 4 };
    int N = arr.Length;
     
    Console.Write(maximumSteps(arr, N));
}
}
  
// This code is contributed by Princi Singh

Javascript

<script>
 
// Javascript program to implement
// the above approach
  
  
// Function to find maximum steps to
// remove all coins from the arr[]
function maximumSteps(arr, N)
{
      
    // Store the frequency of array
    // elements in ascending order
    var map = new Map();
      
      
    // Traverse the arr[] array
    for (var i = 0; i < N; i++) {
        if(map.has(arr[i]))
        {
            map.set(arr[i], map.get(arr[i])+1);
        }
        else
        {
            map.set(arr[i], 1);
        }
    }
      
      
    // Stores count of steps required
    // to remove all the array elements
    var cntSteps = 0;
      
      
    // Traverse the map
    map.forEach((value, key) => {
          
        // Stores the smallest element
        // of map
        var X = key;
          
        // If frequency if X
        // greater than 0
        if (value > 0) {
              
            // Update cntSteps
            cntSteps++;
              
              
            // Mark X as
            // removed element
            map.set(X, 0);
             
             
            // If frequency of (X + 1)
            // greater than  0
            if (map.has(X + 1))
                  
                  
                // Mark (X + 1) as
                // removed element
                map.set(X+1, 0);
        }
    });
 
    return cntSteps;
}
  
  
// Driver Code
var arr = [5, 1, 3, 2, 6, 7, 4];
var N = arr.length;
document.write( maximumSteps(arr, N));
 
</script>
Producción: 

4

 

Complejidad de tiempo: O(N * Log(N))  
Complejidad de espacio: O(N)

Publicación traducida automáticamente

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