【剑指offer】30. 包含min函数的栈

132 阅读1分钟

题目描述

在这里插入图片描述

在这里插入图片描述

// 力扣
// 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的
// min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

// 牛客
// 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的
// min函数(时间复杂度应为O(1))。

题解

// 这题要求O(1)复杂度,遍历数据结构的所有位置找最小值肯定是不可能的,
// 这就需要新创建一个栈minstack用于专门存储push进栈A的最小的值,
// 并且把最小值一直置于minstack的栈顶,这样需要的时候直接弹出就是O(1)
// 复杂度了。

// 总的来说,minstack只用于存储最小或曾经的最小值,如果minstack
// 为空,push时直接压进去,如果minstack非空,则push之前先判断压入元素
// 与minstack栈顶元素谁比较小,取小的那个数压入。
// (如果压入元素不比minstack栈顶元素小也没关系,这样会重新压一个
// minstack栈顶元素进去,保证了minstack和dataStack两个栈的长度一致)


// 牛客
// 运行时间:11ms
// 占用内存:9796k
import java.util.Stack;

public class Solution {
	private Stack<Integer> minStack = new Stack<>();
	private Stack<Integer> dataStack = new Stack<>();

	public void push(int node) {
		if (minStack.isEmpty()) 
			minStack.push(node);
		else  // 取minStack栈顶元素和压入元素最小的那个压入
			minStack.push(Math.min(minStack.peek(), node));
		dataStack.push(node);
	}
	
	public void pop() {
		dataStack.pop();
		minStack.pop();
	}
	
	public int top() {
		return dataStack.peek();
	}
	
	public int min() {
		return minStack.peek();
	}
}


// 力扣
// 执行用时:21 ms, 在所有 Java 提交中击败了85.37%的用户
// 内存消耗:40.3 MB, 在所有 Java 提交中击败了61.41%的用户
import java.util.Stack;

class MinStack {
    private Stack<Integer> minStack;
    private Stack<Integer> dataStack;
    
    /** initialize your data structure here. */
    public MinStack() {
        minStack = new Stack<>();
        dataStack = new Stack<>();
    }
    
    public void push(int x) {
        if (minStack.isEmpty())
            minStack.push(x);
        else {
            minStack.push(Math.min(minStack.peek(), x));
        }
        dataStack.push(x);
    }
    
    public void pop() {
        dataStack.pop();
        minStack.pop();
    }
    
    public int top() {
        return dataStack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */