Incremento/decremento mínimo para hacer que la array no sea creciente

Dada una array a, su tarea es convertirla en una forma no creciente de modo que podamos incrementar o disminuir el valor de la array en 1 en los cambios mínimos posibles.

Ejemplos: 

Entrada: a[] = {3, 1, 2, 1}
Salida: 1
Explicación: podemos convertir la array en 3 1 1 1 cambiando el tercer elemento de la array, es decir, 2 en su entero anterior 1 en un paso, por lo tanto, solo un paso es requerido.

Entrada: a[] = {3, 1, 5, 1}
Salida: 4
Explicación: Necesitamos disminuir 5 a 1 para hacer que la array se ordene en orden no creciente.

Entrada: a[] = {1, 5, 5, 5}
Salida: 4
Explicación: Necesitamos aumentar 1 a 5.

Enfoque de fuerza bruta: consideramos ambas posibilidades para cada elemento y encontramos un mínimo de dos posibilidades. 

Método de enfoque eficiente 1 (usando Min-Heap):
Calcule la suma de las diferencias absolutas entre los elementos de la array final y los elementos de la array actual. Así, la respuesta será la suma de la diferencia entre el elemento i-ésimo y el elemento más pequeño que haya ocurrido hasta entonces. Para esto, podemos mantener un montón mínimo para encontrar el elemento más pequeño encontrado hasta ese momento. En la cola de prioridad mínima, pondremos los elementos, y los nuevos elementos se comparan con el mínimo anterior. Si se encuentra el nuevo mínimo, lo actualizaremos, esto se hace porque cada uno de los siguientes elementos que vienen deben ser más pequeños que el elemento mínimo actual encontrado hasta ahora. Aquí, calculamos la diferencia para que podamos obtener cuánto tenemos que cambiar el número actual para que sea igual o menor que los números anteriores encontrados. Por último,

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

C++14

// CPP code to count the change required to
// convert the array into non-increasing array
#include <bits/stdc++.h>
using namespace std;
 
int DecreasingArray(int a[], int n)
{
    int sum = 0, dif = 0;
 
    // min heap
    priority_queue<int, vector<int>, greater<int> > pq;
 
    // Here in the loop we will check that whether
    // the top of priority queue is less than
    // the upcoming array element. If yes then
    // we calculate the difference. After that
    // we will remove that element and push the
    // current element in queue. And the sum
    // is incremented by the value of difference
    for (int i = 0; i < n; i++) {
        if (!pq.empty() && pq.top() < a[i]) {
            dif = a[i] - pq.top();
            sum += dif;
 
            // Removing that minimum element
            // which does follow the decreasing
            // property and replacing it with a[i]
            // to maintain the condition
            pq.pop();
            pq.push(a[i]);
        }
 
        // Push the current element as well
        pq.push(a[i]);
    }
 
    return sum;
}
 
// Driver Code
int main()
{
    int a[] = { 3, 1, 2, 1 };
    int n = sizeof(a) / sizeof(a[0]);
 
    cout << DecreasingArray(a, n);
 
    return 0;
}

Java

// Java code to count the change required to
// convert the array into non-increasing array
import java.util.PriorityQueue;
 
class GFG
{
    public static int DecreasingArray(int a[], int n)
    {
        int sum = 0, dif = 0;
 
        PriorityQueue<Integer> pq = new PriorityQueue<>();
 
        // Here in the loop we will
        // check that whether the upcoming
        // element of array is less than top
        // of priority queue. If yes then we
        // calculate the difference. After
        // that we will remove that element
        // and push the current element in
        // queue. And the sum is incremented
        // by the value of difference
        for (int i = 0; i < n; i++)
        {
            if (!pq.isEmpty() && pq.element() < a[i])
            {
                dif = a[i] - pq.element();
                sum += dif;
                pq.remove();
                  pq.add(a[i]);
            }
            pq.add(a[i]);
        }
     
    return sum;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
         
        int[] a = {3, 1, 2, 1};
         
        int n = a.length;
 
        System.out.println(DecreasingArray(a, n));
    }
}
 
// This Code is contributed by sanjeev2552

Python3

# Python3 code to count the change required to
# convert the array into non-increasing array
from queue import PriorityQueue
 
def DecreasingArray(a, n):
     
    ss, dif = (0,0)
     
    # min heap
    pq = PriorityQueue()
 
    # Here in the loop we will
    # check that whether the upcoming
    # element of array is less than top
    # of priority queue. If yes then we
    # calculate the difference. After
    # that we will remove that element
    # and push the current element in
    # queue. And the sum is incremented
    # by the value of difference
    for i in range(n):
        tmp = 0
         
        if not pq.empty():
            tmp = pq.get()
            pq.put(tmp)
         
        if not pq.empty() and tmp < a[i]:
            dif = a[i] - tmp
            ss += dif
            pq.get()
            pq.put(a[i])
         
        pq.put(a[i])
       
    return ss
     
# Driver code   
if __name__=="__main__":
     
    a = [ 3, 1, 2, 1 ]
    n = len(a)
  
    print(DecreasingArray(a, n))
     
# This code is contributed by rutvik_56

C#

// C# code to count the change required to
// convert the array into non-increasing array
using System;
using System.Collections.Generic;
class GFG
{
    static int DecreasingArray(int[] a, int n)
    {
        int sum = 0, dif = 0;
      
        // min heap
        List<int> pq = new List<int>();
      
        // Here in the loop we will
        // check that whether the upcoming
        // element of array is less than top
        // of priority queue. If yes then we
        // calculate the difference. After
        // that we will remove that element
        // and push the current element in
        // queue. And the sum is incremented
        // by the value of difference
        for (int i = 0; i < n; i++)
        {
            if (pq.Count > 0 && pq[0] < a[i])
            {
                dif = a[i] - pq[0];
                sum += dif;
                pq.RemoveAt(0);
                  pq.Add(a[i]);
            }
            pq.Add(a[i]);
            pq.Sort();
        }
      
        return sum;
    }  
 
  // Driver code
  static void Main()
  {
    int[] a = { 3, 1, 2, 1 };
    int n = a.Length;
  
    Console.Write(DecreasingArray(a, n));
  }
}
 
// This code is contributed by divyeshrabadiya07.

Javascript

<script>
 
// Javascript code to count the change required to
// convert the array into non-increasing array
function DecreasingArray(a, n)
{
    var sum = 0, dif = 0;
 
    // min heap
    var pq = [];
 
    // Here in the loop we will
    // check that whether the upcoming
    // element of array is less than top
    // of priority queue. If yes then we
    // calculate the difference. After
    // that we will remove that element
    // and push the current element in
    // queue. And the sum is incremented
    // by the value of difference
    for (var i = 0; i < n; i++)
    {
        if (pq.length != 0 && pq[pq.length - 1] < a[i]) {
            dif = a[i] - pq[pq.length - 1];
            sum += dif;
            pq.pop();
            pq.push(a[i]);
        }
        pq.push(a[i]);
        pq.sort((a, b)=>b - a);
    }
 
    return sum;
}
 
// Driver Code
var a = [3, 1, 2, 1];
var n = a.length;
document.write(DecreasingArray(a, n));
 
// This code is contributed by rrrtnx.
</script>
Producción

1

Complejidad de Tiempo: O(n log(n))  
Espacio Auxiliar: O(n)

Método 2: usar Max-Heap
Traverse en orden inverso en la array dada y mantener la propiedad creciente. Si algún elemento es más pequeño que el máximo de elementos existentes hasta ese índice, entonces, necesitamos hacer una operación de disminución en ese elemento máximo para que también siga la propiedad creciente del recorrido hacia atrás y agregue la operación requerida en la respuesta.

C++

// CPP code to count the change required to
// convert the array into non-increasing array
#include <bits/stdc++.h>
using namespace std;
 
int DecreasingArray(int arr[], int n)
{
    int ans = 0;
 
    // max heap
    priority_queue<int> pq;
 
    // Here in the loop we will
    // check that whether the top
    // of priority queue is greater than the upcoming array
    // element. If yes then we calculate the difference.
    // After that we will remove that element and push the
    // current element in queue. And the sum is incremented
    // by the value of difference
 
    for (int i = n - 1; i >= 0; i--) {
        if (!pq.empty() and pq.top() > arr[i]) {
            ans += abs(arr[i] - pq.top());
            pq.pop();
            pq.push(arr[i]);
        }
        pq.push(arr[i]);
    }
    return ans;
}
 
// Driver Code
int main()
{
    int a[] = { 3, 1, 2, 1 };
    int n = sizeof(a) / sizeof(a[0]);
 
    cout << DecreasingArray(a, n);
 
    return 0;
}

Java

// Java code to count the change required to
// convert the array into non-increasing array
import java.io.*;
import java.util.*;
 
class GFG {
    public static int DecreasingArray(int arr[], int n)
    {
        int ans = 0;
 
        // max heap
        PriorityQueue<Integer> pq = new PriorityQueue<>(
            Collections.reverseOrder());
 
        // Here in the loop we will
        // check that whether the top
        // of priority queue is greater than the upcoming
        // array element. If yes then we calculate the
        // difference. After that we will remove that
        // element and push the current element in queue.
        // And the sum is incremented by the value of
        // difference
 
        for (int i = n - 1; i >= 0; i--) {
            if (!pq.isEmpty() && pq.peek() > arr[i]) {
                ans += Math.abs(arr[i] - pq.peek());
                pq.poll();
                pq.add(arr[i]);
            }
            pq.add(arr[i]);
        }
        return ans;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int a[] = { 3, 1, 2, 1 };
        int n = a.length;
 
        System.out.print(DecreasingArray(a, n));
    }
}
 
// This code is contributed by Rohit Pradhan

Producción:

1

Complejidad de Tiempo: O(n log(n)) 
Espacio Auxiliar: O(n)

Ver también: Convertir a una array estrictamente creciente con cambios mínimos. 

Publicación traducida automáticamente

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