Reducir Array reemplazando pares de signos opuestos adyacentes con su máximo absoluto

Dada una array arr[] de tamaño N , la tarea es encontrar la array final realizando repetidamente las siguientes operaciones si dos elementos de signos opuestos son adyacentes:

  • Elimine los dos elementos con signo opuesto de la array e inserte el elemento que tenga el valor absoluto máximo junto con su signo.
  • Si ambos elementos tienen el mismo valor absoluto, ambos se eliminarán de la array.

Ejemplos:

Entrada: arr[] = {10, -5, -8, 2, -5}
Salida: 10
Explicación: 
en el índice 0: el elemento 10 tiene signo positivo.
En el Índice 1: -5 tiene un valor absoluto menor que 10. Reemplace ambos con 10.
En el Índice 2: -8 tiene un valor absoluto menor que 10. Reemplace ambos con 10.
En el Índice 3: 2 tiene signo positivo. Entonces estará en la array.
En el Índice 4: -5 tiene un valor absoluto mayor que 2. Reemplácelos a ambos con 5.
Ahora -5 tiene un valor absoluto menor que 10. Reemplácelos a ambos con 10.

Entrada: arr[] = {5, -5, -2, -10}
Salida: -2 -10
Explicación: el primer y segundo elemento se descartan porque 
ambos elementos tienen los mismos valores pero signo opuesto.
Los elementos 3 y 4 tienen el mismo signo. Entonces ambos estarán en la array.

 

Enfoque: El problema se puede resolver usando la siguiente idea:

En cualquier momento, también se pueden requerir los elementos anteriores, por lo que se puede usar una   estructura de datos Stack para contener los elementos, y los elementos más pequeños se pueden extraer de manera eficiente de la pila debido a su propiedad de último en entrar, primero en salir.

Mire la siguiente ilustración para una mejor comprensión:

Considere la array arr[] = {10, -5, -8, 2, -5}.

Inicialmente, la pila está vacía, st = { }

En el índice 0: =
        > arr[0] = 10
        => st = {}
        => Empuje 10 en la pila
        => La pila es st = {10}

En el 1er índice:
        => arr[1] = -5
        => st = {10}
        => El elemento superior de la pila es positivo y arr[1] es negativo. 
        => Como arr[1] tiene un valor absoluto menor, es decir, 5 que el elemento superior de la pila, por lo que no hay cambios en la pila.
        => La pila es st = {10}

En el segundo índice:
        => arr[2] = -8
        => st = {10}
        => El elemento superior de la pila es positivo y arr[2] es negativo. 
        => Como arr[2] tiene un valor absoluto menor, es decir, 8 que el elemento superior de la pila, por lo que no hay cambios en la pila.
        => La pila es st = {10}

En el tercer índice:
        => arr[3] = 2
        => El elemento superior de la pila es positivo y arr[3] también es positivo. 
        => Empuje 2 en la pila.
        => La pila es st = {10, 2}

En el cuarto índice:
        => arr[4] = -5
        => st = {10, 2}
        => El elemento superior de la pila es positivo y arr[4] es negativo. 
        => Como arr[4] tiene un valor absoluto mayor, es decir, 5 que el elemento superior de la pila, saque el elemento superior de la pila.
        => La pila cambia de st = {10, 2 } a st = {10}
        => Ahora nuevamente, el elemento superior de la pila es positivo y arr[4] es negativo. 
        => arr[4] tiene un valor absoluto menor, es decir, 5 que el elemento superior. Así que no hay cambios en la pila.
        => La pila permanece st = {10}

Los elementos que finalmente quedan en la pila son los elementos finales de la array. 

Entonces, los elementos que quedan en la array son arr = {10} 

Siga los pasos que se mencionan a continuación para implementar el enfoque:

  • Declare una pila para contener los elementos de la array.
  • Atraviese la array. Si el elemento es positivo, empújelo directamente a la pila.
  • De lo contrario, si el arr actual [i] es negativo, entonces
    • Intente extraer todos los elementos más pequeños de la pila que sean positivos , indicando que el elemento que tiene un valor absoluto más pequeño ha sido descartado.
    • Si el elemento actual y la parte superior de la pila son iguales y la parte superior de la pila es positiva , salte de la pila, indicando que ambos elementos con valores iguales pero con el signo opuesto han sido descartados.
    • Por último, si la pila está vacía o el último elemento es negativo, inserte el elemento arr[i] actual en la pila. Como todos los elementos restantes tendrán signo negativo.
  • Finalmente, devuelva la pila, mostrando los elementos restantes.

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

C++

// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
 
class Solution {
  public:
  // Function to find the remaining elements
  vector<int> solve(vector<int>& arr)
  {
 
    // Stack to store elements
    vector<int> st;
 
    // Traverse entire array
    for (auto element : arr) {
 
      // If positive element,
      // directly push
      if (element >= 0)
        st.push_back(element);
 
      else {
        // Pop all the smaller elements
        // moving in the right direction
        while (st.size() > 0 && st.back() >= 0
               && abs(element) > st.back())
          st.pop_back();
 
        // Top of stack and current
        // element same value and top of
        // stack moving in right direction
        if (st.size() > 0 && st.back() >= 0
            && st.back() == abs(element))
          st.pop_back();
 
        // No more elements remaining or
        // remaining elements
        // moving in left direction
        else if (st.size() == 0 || st.back() < 0)
          st.push_back(element);
      }
    }
    // Finally return stack
    return st;
  }
};
 
// Driver code
int main()
{
  Solution obj;
  vector<int> arr = { 5, -5, -2, -10 };
 
  vector<int> ans = obj.solve(arr);
  for (auto x : ans)
    cout << x << " ";
 
  return 0;
}
 
// This code is contributed by rakeshsahni

Java

import java.util.*;
import java.io.*;
 
class GFG{
 
  // Function to find remaining element
  public static ArrayList<Integer> solve(ArrayList<Integer> arr){
 
    // Stack to store elements
    ArrayList<Integer> st = new ArrayList<Integer>();
 
    // Traverse entire array
    for(Integer element: arr){
 
      // If positive element,
      // directly push
      if(element >= 0)
      {
        st.add(element);
      }
      else
      {
        // Pop all the smaller elements
        // moving in the right direction
        while(st.size()>0 && st.get(st.size()-1) >= 0 && Math.abs(element) > st.get(st.size()-1)){
          st.remove(st.size()-1);
        }
 
        // Top of stack and current
        // element same value and top of
        // stack moving in right direction
        if (st.size() > 0 && st.get(st.size()-1) >= 0 && st.get(st.size()-1) == Math.abs(element)){
          st.remove(st.size()-1);
        }
 
        // No more elements remaining or
        // remaining elements
        // moving in left direction
        else if (st.size() == 0 || st.get(st.size()-1) < 0){
          st.add(element);
        }
      }
    }
    // Finally return stack
    return st;
 
  }
 
  // Driver code
  public static void main(String args[])
  {
    // Size of array
    int N = 5;
    ArrayList<Integer> arr = new ArrayList<Integer>();
    arr.add(5);
    arr.add(-5);
    arr.add(-2);
    arr.add(-10);
 
    ArrayList<Integer> ans = solve(arr);
 
    for(int i=0 ; i<ans.size() ; i++){
      System.out.print(ans.get(i) + " ");
    }
  }
}
 
// This code is contributed by subhamgoyal2014.

Python3

# Python code to implement the approach
 
class Solution:
    # Function to find the remaining elements
    def solve(self, arr):
 
        # Stack to store elements
        stack = []
 
        # Traverse entire array
        for element in arr:
 
            # If positive element,
            # directly push
            if (element >= 0):
                stack.append(element)
 
            else:
                # Pop all the smaller elements
                # moving in the right direction
                while(stack and stack[-1] >= 0 \
                      and abs(element) > stack[-1]):
                    stack.pop()
 
                # Top of stack and current
                # element same value and top of
                #  stack moving in right direction
                if (stack and stack[-1] >= 0 \
                    and stack[-1] == abs(element)):
                    stack.pop()
 
                # No more elements remaining or
                # remaining elements
                # moving in left direction
                elif(len(stack) == 0 \
                     or stack[-1] < 0):
                    stack.append(element)
 
        # Finally return stack
        return stack
 
# Driver code
if __name__ == '__main__':
    obj = Solution()
    arr = [5, -5, -2, -10]
    ans = obj.solve(arr)
    for x in ans:
        print(x, end = " ")

C#

using System;
using System.Collections.Generic;
 
public class GFG{
 
  // Function to find remaining element
  public static List<int> solve(List<int> arr){
 
    // Stack to store elements
    List<int> st = new List<int>();
 
    // Traverse entire array
    foreach(int element in arr){
 
      // If positive element,
      // directly push
      if(element >= 0)
      {
        st.Add(element);
      }
      else
      {
        // Pop all the smaller elements
        // moving in the right direction
        while(st.Count>0 && st[st.Count-1] >= 0 && Math.Abs(element) > st[st.Count-1]){
          st.RemoveAt(st.Count-1);
        }
 
        // Top of stack and current
        // element same value and top of
        // stack moving in right direction
        if (st.Count > 0 && st[st.Count-1] >= 0 && st[st.Count-1] == Math.Abs(element)){
          st.RemoveAt(st.Count-1);
        }
 
        // No more elements remaining or
        // remaining elements
        // moving in left direction
        else if (st.Count == 0 || st[st.Count-1] < 0){
          st.Add(element);
        }
      }
    }
    // Finally return stack
    return st;
 
  }
 
  // Driver code
  public static void Main(String []args)
  {
    // Size of array
    int N = 5;
    List<int> arr = new List<int>();
    arr.Add(5);
    arr.Add(-5);
    arr.Add(-2);
    arr.Add(-10);
 
    List<int> ans = solve(arr);
 
    for(int i = 0; i < ans.Count; i++){
      Console.Write(ans[i] + " ");
    }
  }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
 
// JavaScript code to implement the approach
class Solution
{
 
  // Function to find the remaining elements
   solve(arr)
  {
 
    // Stack to store elements
    let st = [];
 
    // Traverse entire array
    for (let element of arr) {
 
      // If positive element,
      // directly push
      if (element >= 0)
        st.push(element);
 
      else
      {
       
        // Pop all the smaller elements
        // moving in the right direction
        while (st.length > 0 && st[st.length-1] >= 0
               && Math.abs(element) > st[st.length-1])
          st.pop();
 
        // Top of stack and current
        // element same value and top of
        // stack moving in right direction
        if (st.length > 0 && st[st.length-1] >= 0
            && st[st.length-1] == Math.abs(element))
          st.pop();
 
        // No more elements remaining or
        // remaining elements
        // moving in left direction
        else if (st.length == 0 || st[st.length-1] < 0)
          st.push(element);
      }
    }
    // Finally return stack
    return st;
  }
}
 
// Driver code
  let obj = new Solution();
  let arr = [ 5, -5, -2, -10 ];
 
  let ans = obj.solve(arr);
  for (let x of ans)
    document.write(x," ");
 
// This code is contributed by shinjanpatra
 
</script>
Producción

-2 -10 

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

Publicación traducida automáticamente

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