Min Stack

Este problema consisten en tener un stack el cual siqmpre se le pueda requerir el menor elemento en el stack y este siempre lo puede regresar

Solucion C++

Esta fue mi por algún motivo parece que leetcode no puede aceptar resultado que usen mallor y realloc, pues en mi computadora si funciono hasta cierto punto este primer intento

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <limits.h>

class MinStack {
public:
    int min;
    int len;
    int *stack;
    int act;
    int com;
    
    MinStack() {
        stack =(int *) malloc (5*sizeof(int));
        len = 5;
        act=0;
        min = INT_MAX;

    }
    
    void push(int val) {
        if (val<min)
            min=val;
        if (act+1==len){
            realloc(stack, (len*2)*sizeof(int));
            len = len*2;
        }
            
        //Añadir
        stack[act]=val;
        act++;

    }
    
    void pop() {
        com++;
    }
    
    int top() {
        return stack[com];
    }
    
    int getMin() {
        return min;
    }

  void print(){
    for (int i = 0; i<len;i++){
      std::cout<<stack[i]<<" ";
    }
    std::cout<<"\n";
  }
};

int main (int argc, char *argv[]) {
  MinStack* obj = new MinStack();
obj->push(-2);
obj->push(0);
obj->push(-3);
  obj->print();
  std::cout<<obj->getMin()<<"\n"; // return -3
obj->pop();
  std::cout<<obj->top()<<"\n";    // return 0
  std::cout<<obj->getMin()<<" ?2\n"; // return -2
  obj->print();
  return 0;
}

La verdadera respuesta consiste en tener dos vectores en uno se guardan los elementos del stack y en el otro se debe guardar siempre el menor elemento en la lista hasta ese momento

Solución Ruby

Esta solución tiene dos arrays uno para el valor mínimo en ese momento del array y otro para almacenar los valores, estos se actualizan al mismo tiempo

class MinStack
    def initialize()
        @min = []
        @arr = []
    end


=begin
    :type val: Integer
    :rtype: Void
=end
    def push(val)
        
        if @min.length ==0
            @min << val 
        else
            if val < @min.last
                @min << val
            else
                @min << @min.last
            end
        end
        @arr << val
    end


=begin
    :rtype: Void
=end
    def pop()
        @arr.pop
        @min.pop
    end


=begin
    :rtype: Integer
=end
    def top()
        @arr.last
    end


=begin
    :rtype: Integer
=end
    def get_min()
        @min.last
    end


end

# Your MinStack object will be instantiated and called as such:
# obj = MinStack.new()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.get_min()