Recuento de elementos únicos después de insertar el promedio de MEX y Array Max K veces

Dada una array A[] de N enteros no negativos y un entero K . Cada vez, puede hacer las siguientes dos operaciones

  • Encuentre el promedio de MAX y MEX (redondeado al entero mayor más cercano) de la array.
  • Inserte el promedio calculado en la array.

Después de realizar la operación anterior K veces, encuentre la cantidad de elementos únicos presentes en la array. 

Nota: MEX es el número entero positivo mínimo que no está presente en la array.

Ejemplos:

Entrada: A = [ 0, 5, 1, 2, 1, 8 ], K=1
Salida: 6
Explicación: En la primera operación, Max = 8 y MEX = 3 .  
Entonces el promedio es ( 8 + 3 ) / 2 = 5.5 = 6 (redondeado hacia arriba). 
Inserte 6 en la array, luego Array se convierte en: [ 0, 5, 1, 2, 1, 8, 6 ]. 
Entonces, el recuento de elementos únicos es 6 .

Entrada: A = [ 0, 1, 2 ], K = 2
Salida: 5
Explicación: En la primera operación, Max = 2 y MEX = 3. 
Entonces el promedio es ( 2 + 3 ) / 2 = 2.5 = 3 (redondeado hacia arriba). 
Agregue 3 en la array, luego la array se convierte en: [ 0, 1, 2, 3 ].
En la segunda operación, nuevamente Max = 3 y MEX = 4, Average = 4. 
Entonces agregue 4 en la array. Ahora el Array se convierte en [ 0, 1, 2, 3, 4 ].
Entonces, el recuento de elementos únicos es 5.

 

Enfoque ingenuo: recorra la array dada K veces, y en cada iteración:

  • Averigüe el MAX y MEX en la array.
  • Calcular el promedio.
  • Inserte ese elemento en la array.

Complejidad temporal: O(N*K)
Espacio auxiliar: O(1)

Enfoque Eficiente: La solución al problema se basa en los siguientes dos casos:

Caso-1 (Cuando Max > MEX): El promedio de Max y MEX siempre estará entre Max y MEX y no habrá cambios en el valor Max o el valor MEX. 
Entonces no importa si el promedio se suma una vez o K veces. 
Si el promedio es único, el recuento de elementos únicos aumentará en 1; de lo contrario, el recuento único será el mismo.

Caso-2 (Cuando Max < MEX): El promedio de Max y MEX siempre será mayor que el Max existente. Entonces, en cada paso, se agregará un nuevo elemento único a la array, es decir, un total de K elementos agregados en K operaciones. 
por ejemplo, arr[] = {0, 1, 2} y K = 2. 

  • En el primer paso Max y MEX son 2 y 3 respectivamente. Entonces se sumará (2+3)/2 = 3. La array será {0, 1, 2, 3}.
  • En el segundo paso Max y MEX son 3 y 4 respectivamente. Entonces se sumará (3+4)/2 = 4. La array será {0, 1, 2, 3, 4}. Por lo tanto, se agregarán 2 elementos únicos en 2 operaciones.

Siga los pasos que se mencionan a continuación para resolver el problema:

  • Cree una array hash para almacenar los elementos únicos.
  • Inserte todos los elementos de array dados en la array hash.
  • Calcule Max y MEX para la array dada.
    • Si Max es mayor que MEX , calcule el promedio e introdúzcalo en la array hash.
    • Si MEX es mayor que Max , simplemente agregue K al conteo de elementos únicos en la array porque, en todas las operaciones K, el elemento único se agrega a la array.
  • Devuelve el recuento de los elementos únicos en la array hash.

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

C++

//c++ program for Count number Unique element after
//adding average of MEX and MAX in array K times.
#include <bits/stdc++.h>
using namespace std;
 
int uniqueElement(vector<int>& A, int K)
{
    // Hash array
    unordered_map<int, int> mp;
 
    int max_no = 0;
    // Find out MAX of given Array
    for (int i = 0; i < A.size(); i++) {
        mp[A[i]]++;
        max_no = max(max_no, A[i]);
    }
 
    int mex = INT_MIN;
   
    // Find out MEX of given Array
    for (int i = 0; i < max_no; i++) {
        if (mp.find(i) == mp.end()) {
            mex = i;
            break;
        }
    }
    if (mex == INT_MIN)
        mex = max_no + 1;
 
    // Hash array contains only unique elements
    // So number of unique elements in array =
    // size of Hash array
    int unique = mp.size();
 
    if (K != 0) {
        if (max_no > mex) {
 
      // Calculated rounded average of MAX and MEX
            int avg = round((float)(max_no + mex) / 2);
 
        // If MAX > MEX and avg in not present
        //  in array Increment count of unique
        //element by one.
            if (mp[avg] == 0)
                unique++;
        }
 
        // If MEX > MAX, for every operation, one
        //  new unique element is added in array
        else {
            unique += K;
        }
    }
    return unique;
}
//Driver code
int main()
{
    vector<int> A = { 3, 0, 2, 4, 1, 2, 3, 5 };
    int K = 3;
 
    cout << uniqueElement(A, K);
 
    return 0;
}

Java

import java.util.*;
import java.io.*;
 
class GFG{
 
    // Function to find remaining element
    public static int uniqueElement(ArrayList<Integer> A, int K){
 
        // Hash array
        TreeMap<Integer, Integer> mp = new TreeMap<Integer,Integer>();
 
        int max_no = 0;
       
        // Find out MAX of given Array
        for(int i = 0 ; i<A.size() ; i++){
            if(mp.containsKey(A.get(i))){
                mp.put(A.get(i), mp.get(A.get(i))+1);
            }else{
                mp.put(A.get(i), 1);
            }
            max_no = Math.max(max_no, A.get(i));
        }
 
        int mex = -1;
 
        // Find out MEX of given Array
        for(int i=0 ; i<max_no ; i++){
            if(mp.containsKey(i)){
 
            }else{
                mex = i;
                break;
            }
        }
        if(mex==-1){
            mex = max_no+1;
        }
 
        // Hash array contains only unique elements
        // So number of unique elements in array =
        // size of Hash array
        int unique = mp.size();
 
        if(K != 0){
            if(max_no > mex){
 
                // Calculated rounded average of MAX and MEX
                int avg = Math.round((float)(max_no+mex)/2);
 
                // If MAX > MEX and avg in not present
                //  in array Increment count of unique
                //element by one.
                if (!mp.containsKey(avg) || mp.get(avg) == 0){
                    unique++;
                }
            }
 
            // If MEX > MAX, for every operation, one
            //  new unique element is added in array
            else {
                unique += K;
            }
        }
        return unique;
    }
 
    // Driver code
    public static void main(String args[])
    {
        // Size of array
        ArrayList<Integer> A = new ArrayList<Integer>(
            List.of(3, 0, 2, 4, 1, 2, 3, 5)
        );
        int K = 3;
 
        // Function call
        System.out.println(uniqueElement(A, K));
    }
}
 
// This code is contributed by subhamgoyal2014.

Python3

# python3 program for Count number Unique element after
# adding average of MEX and MAX in array K times.
INT_MIN = -2147483647 - 1
 
def uniqueElement(A, K):
 
    # Hash array
    mp = {}
    max_no = 0
     
    # Find out MAX of given Array
    for i in range(0, len(A)):
        mp[A[i]] = mp[A[i]] + 1 if A[i] in mp else 1
        max_no = max(max_no, A[i])
 
    mex = INT_MIN
 
    # Find out MEX of given Array
    for i in range(0, max_no):
        if (not i in mp):
            mex = i
            break
 
    if (mex == INT_MIN):
        mex = max_no + 1
 
    # Hash array contains only unique elements
    # So number of unique elements in array =
    # size of Hash array
    unique = len(mp)
 
    if (K != 0):
        if (max_no > mex):
 
            # Calculated rounded average of MAX and MEX
            avg = round((max_no + mex) / 2)
 
        # If MAX > MEX and avg in not present
        # in array Increment count of unique
        # element by one.
            if (mp[avg] == 0):
                unique += 1
 
        # If MEX > MAX, for every operation, one
        # new unique element is added in array
        else:
            unique += K
 
    return unique
 
# Driver code
if __name__ == "__main__":
 
    A = [3, 0, 2, 4, 1, 2, 3, 5]
    K = 3
 
    print(uniqueElement(A, K))
 
    # This code is contributed by rakeshsahni

C#

// c# program for Count number Unique element after
// adding average of MEX and MAX in array K times.
using System;
using System.Collections.Generic;
 
class GFG {
 
  static int uniqueElement(int[] A, int K)
  {
 
    // Hash array
    Dictionary<int, int> mp
      = new Dictionary<int, int>();
 
    int max_no = 0;
 
    // Find out MAX of given Array
    for (int i = 0; i < A.Length; i++) {
      if (mp.ContainsKey(A[i])) {
        mp[A[i]] = mp[A[i]] + 1;
      }
      else {
        mp.Add(A[i], 1);
      }
      max_no = Math.Max(max_no, A[i]);
    }
 
    int mex = Int32.MinValue;
 
    // Find out MEX of given Array
    for (int i = 0; i < max_no; i++) {
      if (!mp.ContainsKey(i)) {
        mex = i;
        break;
      }
    }
    if (mex == Int32.MinValue)
      mex = max_no + 1;
 
    // Hash array contains only unique elements
    // So number of unique elements in array =
    // size of Hash array
    int unique = mp.Count;
 
    if (K != 0) {
      if (max_no > mex) {
 
        // Calculated rounded average of MAX and MEX
        float temp = (max_no + mex) / 2;
        int avg = (int)Math.Round(temp);
 
        // If MAX > MEX and avg in not present
        //  in array Increment count of unique
        // element by one.
        if (mp[avg] == 0)
          unique++;
      }
 
      // If MEX > MAX, for every operation, one
      //  new unique element is added in array
      else {
        unique += K;
      }
    }
    return unique;
  }
 
  // Driver code
  public static void Main()
  {
    int[] A = { 3, 0, 2, 4, 1, 2, 3, 5 };
    int K = 3;
 
    Console.Write(uniqueElement(A, K));
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
        // JavaScript code for the above approach
        function uniqueElement(A, K)
        {
         
            // Hash array
            let mp = new Map();
 
            let max_no = 0;
            // Find out MAX of given Array
            for (let i = 0; i < A.length; i++) {
                if (mp.has(A[i])) {
                    mp.set(A[i], mp.get(A[i] + 1))
                }
                else {
                    mp.set(A[i], 1)
                }
                max_no = Math.max(max_no, A[i]);
            }
 
            let mex = Number.MIN_VALUE;
 
            // Find out MEX of given Array
            for (let i = 0; i < max_no; i++) {
                if (!mp.has(i)) {
                    mex = i;
                    break;
                }
            }
            if (mex == Number.MIN_VALUE)
                mex = max_no + 1;
 
            // Hash array contains only unique elements
            // So number of unique elements in array =
            // size of Hash array
            let unique = mp.size;
 
            if (K != 0) {
                if (max_no > mex) {
 
                    // Calculated rounded average of MAX and MEX
                    let avg = Math.fround((max_no + mex) / 2);
 
                    // If MAX > MEX and avg in not present
                    //  in array Increment count of unique
                    //element by one.
                    if (mp.get(avg) == 0)
                        unique++;
                }
 
                // If MEX > MAX, for every operation, one
                //  new unique element is added in array
                else {
                    unique += K;
                }
            }
            return unique;
        }
         
        // Driver code
        let A = [3, 0, 2, 4, 1, 2, 3, 5];
        let K = 3;
 
        document.write(uniqueElement(A, K));
 
     // This code is contributed by Potta Lokesh
    </script>

Producción:

9

Complejidad de tiempo: O(N*logN )
Espacio auxiliar: O(N )

Publicación traducida automáticamente

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