[剑指Offer]包含min函数的栈(Java)

剑指Offer题目

包含min函数的栈 -- newcoder 剑指Offer 20

题目描述

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

思路

 * 1、使用两个栈,第一个容纳元素,第二个记录当前的最小值
 * 2、第二个栈,push时,如果当前元素比栈顶元素小,则push一次当前栈顶元素,
 * 3、pop时,直接弹出栈顶元素即可

代码

package com.codinginterviews.stack;

import java.util.Arrays;

/**
 * 题目:
 * 包含min函数的栈 -- newcoder 剑指Offer 20
 * 
 * 题目描述: 
 * 定义栈的数据结构,请在该类型中实现一个能够得到栈中
 * 所含最小元素的min函数(时间复杂度应为O(1))。
 *
 */
public class MinStack {

	// 数组实现栈
    static class Stack<T> {
    	// 初始化容量为10
    	@SuppressWarnings("unchecked")
		private T[] arr = (T[])new Object[10];
    	
    	int capacity = 0;
    	
    	int maxCapacity = 10;
    	
    	public void push(T t) {
    		if (needEnsureCapacity()) {
    			grow();
    		}
    		this.arr[capacity++] = t;
    	}
    	
    	private boolean needEnsureCapacity() {
    		return capacity + 1 > maxCapacity;
    	}
    	
    	// 每次扩容为当前最大容量的1.5倍
    	private void grow() {
    		this.maxCapacity = this.maxCapacity * 3 / 2 + 1;
    		this.arr = Arrays.copyOf(this.arr, this.maxCapacity);
    	}
    	
    	public T pop() {
    		if (capacity <= 0) {
    			return null;
    		}
    		
    		T val = this.arr[capacity-1];
    		this.arr[capacity-1] = null;
    		capacity--;
    		return val;
    	}
    	
    	public T peek() {
    		if (capacity <= 0) {
    			return null;
    		}
    		return this.arr[capacity-1];
    	}
    	
    	public boolean isEmpty() {
    		return capacity == 0;
    	}
    }
	
    
    /**
     * 思路: 
     * 1、使用两个栈,第一个容纳元素,第二个记录当前的最小值
     * 2、第二个栈,push时,如果当前元素比栈顶元素小,则push一次当前栈顶元素,
     * 3、pop时,直接弹出栈顶元素即可
     */
    
    private Stack<Integer> stack = new Stack<>();
    private Stack<Integer> minStack = new Stack<>();
    
    public void push(int node) {
        stack.push(node);
        if (minStack.isEmpty()) {
            minStack.push(node);
        } else {
            minStack.push(Math.min(minStack.peek(), node));
        }
    }
    
    public void pop() {
        stack.pop();
        minStack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值