Número mínimo de pasos para hacer que todos los elementos de la array sean iguales

Dados dos arreglos A[] y B[] de la misma longitud, la tarea es encontrar el número mínimo de pasos necesarios para igualar todos los elementos del arreglo reemplazando el elemento con la diferencia del elemento correspondiente del arreglo B. 
Nota: Si esto no es posible, imprima -1.
Ejemplos: 

Entrada: A[] = {5, 7, 10, 5, 15} B[] = {2, 2, 1, 3, 5} 
Salida:
Explicación: 
Pasos para convertir elementos de Array iguales – 
Índice 0: 5 no es cambiado, Pasos tomados = 0 
Índice 1: 7 – (2 * 1) = 5, Pasos tomados = 1 
Índice 2: 10 – (1 * 5) = 5, Pasos tomados = 5 
Índice 3: 5 no ha cambiado, Pasos tomados = 0 
Índice 4: 15 – (5 * 2) = 5, Pasos tomados = 2 
Por lo tanto, pasos totales requeridos = 0 + 1 + 5 + 0 + 2 = 8

Entrada: A[] = {5, 6}, B[] = {4, 3} 
Salida: -1 
Explicación: 
No es posible hacer que todos los elementos de la array sean iguales. 

Enfoque: La idea es encontrar el valor en el que los elementos de la array pueden converger, este valor definitivamente estará entre 0 y el valor mínimo de la array. A continuación se muestra la ilustración del enfoque: 

  • Inicialmente, marque la bandera como Falso, para verificar si la array es convertible o no.
  • Ejecute un ciclo while hasta que el mínimo de la array sea mayor que -1. 
    • Iterar sobre los índices de la array, es decir, desde 0 hasta longitud – 1
    • Para cada índice, verifique que si el elemento en ese índice en la array A es mayor que el mínimo de la array, en caso afirmativo, actualice el elemento de la array A[i] como A[i] – B[i].
    • Incremente el número de pasos en 1.
    • Verifique que todos los elementos de la array sean iguales en caso afirmativo, luego marque la bandera como Verdadero y rompa el ciclo while
    • De lo contrario, repita los pasos anteriores para calcular el número total de pasos necesarios.
  • Finalmente, verifique si la bandera es Verdadera, si es así, entonces la array es convertible.

Explicación con ejemplo: 
las arrays dadas son: A[] = {5, 7, 10, 5, 15}, B[] = {2, 2, 1, 3, 5} 

array A Índice actual Mínimo de array A Pasos Comentarios
{5, 7, 10, 5, 15} 0 5 0 No operacion !
{5, 5, 10, 5, 15} 1 5 1 El elemento de array se resta una vez. 7 – 2 = 5
{5, 5, 9, 5, 15} 2 5 2 El elemento de array se resta una vez. 10 – 1 = 9
{5, 5, 8, 5, 15} 2 5 3 El elemento de array se resta una vez. 9 – 1 = 8
{5, 5, 7, 5, 15} 2 5 4 El elemento de array se resta una vez. 8 – 1 = 7
{5, 5, 6, 5, 15} 2 5 5 El elemento de array se resta una vez. 7 – 1 = 6
{5, 5, 5, 5, 15} 2 5 6 El elemento de array se resta una vez. 6 – 1 = 5
{5, 5, 5, 5, 10} 4 5 7 El elemento de array se resta una vez. 15 – 5 = 10
{5, 5, 5, 5, 5} 4 5 8 El elemento de array se resta una vez. 10 – 5 = 5

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

C++

// C++ implementation to find the
// minimum number of steps to convert
// array by subtracting the corresponding
// element from array B
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the minimum steps
void minimumSteps(int ar1[], int ar2[], int n)
{
     
    // Counter to store the steps
    int ans = 0;
      
    // Flag to check that
    // array is converted
    bool flag = true;
      
    // Loop until the minimum of the
    // array is greater than -1
    while (*min_element(ar1, ar1 + n) > -1)
    {
        int a = *min_element(ar1, ar1 + n);
         
        // Loop to convert the array
        // elements by subtraction
        for(int i = 0; i < n; i++)
        {
            if (ar1[i] != a)
            {
                ar1[i] -= ar2[i];
                ans += 1;
            }
        }
         
        set<int> s1(ar1, ar1 + n);
         
        // If the array is converted
        if (s1.size() == 1)
        {
            flag = false;
            cout << ans << endl;
            break;
        }
    }
     
    if (flag)
    {
        cout << -1 << endl;
    }
}
         
// Driver Code
int main()
{
    int n = 5;
    int ar1[] = { 5, 7, 10, 5, 15 };
    int ar2[] = { 1, 2, 1, 5, 5 };
      
    // Function call
    minimumSteps(ar1, ar2, n);
  
    return 0;
}
 
// This code is contributed by rutvik_56

Java

// Java implementation to find the
// minimum number of steps to convert
// array by subtracting the corresponding
// element from array B
import java.util.*;
class GFG{
  
// Function to find the
// minimum steps
static void minimumSteps(int ar1[],
                         int ar2[],
                         int n)
{
  // Counter to store the steps
  int ans = 0;
 
  // Flag to check that
  // array is converted
  boolean flag = true;
 
  // Loop until the minimum of the
  // array is greater than -1
  while (Arrays.stream(ar1).min().getAsInt() > -1)
  {
    int a = Arrays.stream(ar1).min().getAsInt();
 
    // Loop to convert the array
    // elements by subtraction
    for(int i = 0; i < n; i++)
    {
      if (ar1[i] != a)
      {
        ar1[i] -= ar2[i];
        ans += 1;
      }
    }
 
    HashSet<Integer> s1 = new HashSet<>();
    for(int i = 0; i < n; i++)
    {
      s1.add(ar1[i]);
    }
 
    // If the array is converted
    if (s1.size() == 1)
    {
      flag = false;
      System.out.print(ans + "\n");
      break;
    }
  }
 
  if (flag)
  {
    System.out.print(-1 + "\n");
  }
}
         
// Driver Code
public static void main(String[] args)
{
  int n = 5;
  int ar1[] = {5, 7, 10, 5, 15};
  int ar2[] = {1, 2, 1, 5, 5};
 
  // Function call
  minimumSteps(ar1, ar2, n);
}
}
 
// This code is contributed by Princi Singh

Python3

# Python3 implementation to find the
# minimum number of steps to convert
# array by subtracting the corresponding
# element from array B
 
# Function to find the minimum steps
def minimumSteps(ar1, ar2, n):
     
    # Counter to store the steps
    ans = 0
     
    # Flag to check that
    # array is converted
    flag = True
     
    # Loop until the minimum of the
    # array is greater than -1
    while min(ar1)>-1:
        a = min(ar1)
         
        # Loop to convert the array
        # elements by subtraction
        for i in range(n):
            if ar1[i]!= a:
                ar1[i]-= ar2[i]
                ans+= 1
                 
        # If the array is converted
        if len(set(ar1))== 1:
            flag = False
            print(ans)
            break
    if flag:
        print(-1)
 
# Driver Code
if __name__ == "__main__":
    n = 5
    ar1 = [5, 7, 10, 5, 15]
    ar2 = [1, 2, 1, 5, 5]
     
    # Function Call
    minimumSteps(ar1, ar2, n)

C#

// C# implementation to
// find the minimum number
// of steps to convert array
// by subtracting the
// corresponding element from
// array B
using System;
using System.Linq;
using System.Collections.Generic;
class GFG{
  
// Function to find the
// minimum steps
static void minimumSteps(int []ar1,
                         int []ar2,
                         int n)
{
  // Counter to store the steps
  int ans = 0;
 
  // Flag to check that
  // array is converted
  bool flag = true;
 
  // Loop until the minimum of the
  // array is greater than -1
  while (ar1.Min() > -1)
  {
    int a = ar1.Min();
 
    // Loop to convert the array
    // elements by subtraction
    for(int i = 0; i < n; i++)
    {
      if (ar1[i] != a)
      {
        ar1[i] -= ar2[i];
        ans += 1;
      }
    }
 
    HashSet<int> s1 = new HashSet<int>();
     
    for(int i = 0; i < n; i++)
    {
      s1.Add(ar1[i]);
    }
 
    // If the array is converted
    if (s1.Count == 1)
    {
      flag = false;
      Console.Write(ans + "\n");
      break;
    }
  }
 
  if (flag)
  {
    Console.Write(-1 + "\n");
  }
}
         
// Driver Code
public static void Main(String[] args)
{
  int n = 5;
  int []ar1 = {5, 7, 10, 5, 15};
  int []ar2 = {1, 2, 1, 5, 5};
 
  // Function call
  minimumSteps(ar1, ar2, n);
}
}
 
// This code is contributed by 29AjayKumar
Producción: 

8

 

Análisis de rendimiento: 

  • Complejidad de tiempo: O(N 2 logN) Como en el enfoque anterior, hay dos bucles para convertir la array. El ciclo externo toma O(N) y el ciclo interno toma O(NlogN) ya que estamos usando set en el ciclo interno.
  • Espacio Auxiliar: O(N). Estamos usando un conjunto que ocupa O(N) espacio adicional. 

Publicación traducida automáticamente

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