实现一个最小栈的push(int x),pop(),top(),min()方法,要求都是常量时间

原题目:https://oj.leetcode.com/problems/min-stack/solution/

此代码已经被leetcode接受,下面的分析结果是leetcode给出的:

Hints:

  • Consider space-time tradeoff. How would you keep track of the minimums using extra space?
  • Make sure to consider duplicate elements.

O(n) runtime, O(n) space – Extra stack:

Use an extra stack to keep track of the current minimum value. During the push operation we choose the new element or the current minimum, whichever that is smaller to push onto the min stack.

O(n) runtime, O(n) space – Minor space optimization:

If a new element is larger than the current minimum, we do not need to push it on to the min stack. When we perform the pop operation, check if the popped element is the same as the current minimum. If it is, pop it off the min stack too.

Cancel rating
1
2
3
4
5

Average Rating: 4.0 (293 votes)

?/**
 * @Author jiangfq
 *
 */
package com.test;

import java.util.Random;

/**
 * @author jiangfq
 *
 */
public class MinStack {

	private static final int INIT_CAPACITY = 16;
	private static final float FACTOR = 0.75f;

	private int[] a = null;
	private int currIndex = 0;
	private int size = 0;
	private int min = Integer.MAX_VALUE;
	private int minIndex = -1;
	public MinStack() {
		a = new int[INIT_CAPACITY];
	}

	public MinStack(int capacity) {
		if(capacity < 1 || capacity > (Integer.MAX_VALUE - 8)) {
			throw new IllegalArgumentException("illegal capacity value: " + capacity);
		}
		a = new int[capacity];
	}

	public void push(int x) {
		if(size > (Integer.MAX_VALUE - 8)) {
			throw new RuntimeException("no more space to store value");
		}
		if(size > 0 && (size + 1) >= a.length) {
			int newSize = (int)(size+size*FACTOR);
			if(newSize > (Integer.MAX_VALUE - 8)) {
				throw new RuntimeException("no more space to store value");
			}
			int[] b = new int[newSize];
			for(int i = 0; i < size; i++) {
				b[i] = a[i];
			}
			a = b;
		}
		if(x < min) {
			min = x;
			minIndex = size;
		}
        a[size++] = x;
        currIndex++;
    }

    public void pop() {
        if(currIndex < 0) {
        	throw new RuntimeException("no more value to pop");
        }
        a[currIndex--] = -1;
        size--;
        System.out.println("size: " + size);
//        System.out.println("currIndex: " + currIndex + ", " + minIndex + ", " + a[currIndex]);
        if(currIndex == minIndex) {
        	int index = 0;
        	int m = a[index];
        	for(int i = (currIndex - 1); i >= 0; i--) {
        		for(int j = i; j >= 0; j--) {
//        			System.out.println("a=" + m + ", " + a[j]);
        			if(m > a[j]) {
        				index = j;
        				m = a[index];
        			}
        		}
        	}
        	min = a[index];
        	minIndex = index;
        }
        if(size == 0) {
        	min = Integer.MAX_VALUE;
        	minIndex = -1;
        }
    }

    public int top() {
    	System.out.println(currIndex+"");
    	return a[currIndex-1];
    }

    public int getMin() {
    	return min;
    }
    public static void main(String[] args) {
    	MinStack ms = new MinStack();
//    	ms.push(2);ms.push(0);ms.push(3);ms.push(0);
//    	System.out.println(+ ms.getMin());
//    	ms.pop();
//    	System.out.println(+ ms.getMin());
//    	ms.pop();
//    	System.out.println(+ ms.getMin());
//    	ms.pop();
//    	System.out.println(+ ms.getMin());

    	ms.push(2147483646);ms.push(2147483646);ms.push(2147483647);
    	System.out.println(ms.top());
    	ms.pop();
    	System.out.println(ms.getMin());
    	ms.pop();
    	System.out.println(ms.getMin());
    	ms.pop();
    	ms.push(2147483647);
    	System.out.println(ms.top());
    	System.out.println(ms.getMin());
    	ms.push(-2147483648);
    	System.out.println(ms.top());
    	System.out.println(ms.getMin());
    	ms.pop();
    	System.out.println(ms.getMin());
    }

}
时间: 2024-09-30 16:37:28

实现一个最小栈的push(int x),pop(),top(),min()方法,要求都是常量时间的相关文章

LeetCode OJ:Min Stack(最小栈问题)

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum e

最小栈的实现和优化

https://mp.weixin.qq.com/s/q5wtEXg_tC-wlyK1uMlJJA 最小栈 实现一个最小栈,一步一步优化,空间O(N) 时间O(1) . import java.util.ArrayList; import java.util.List; /** * @author xiaoshi on 2018/9/1. */ public class MinStack { private List<Integer> data = new ArrayList<Integ

实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈

一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问题分析 之所以认为这个问题有趣,是因为在实现 min 方法的过程 牵涉到了 “缓存一致性”问题.是不是听起来很高大上?哈哈,我臆想的. 思路1:添加一个成员变量总是保存当前栈中最小的元素.该思路的实现代码大致是这样的: public class MinStack { private LinkedLi

实现一个栈,Push,Pop,Min,并且保证时间复杂度为O(1)

#include<iostream>  using namespace std;    struct stack        {          int* _pElem; //指向元素数据的指针          int _capacity;           int _top;             stack( int n )                   :_capacity( n)          {              _top = 0;            

Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1.2.3.4.5,那么4.5.3.2.1 就有可能是一个pop 系列,但序列4.3.5.1.2 就不可能是push 序列1.2.3.4.5 的pop 序列. 分析: 我们首先定义遍历push的序数i=0  遍历pop序列的序数 j =0 我们可以先遍历给出的push序列,并且时刻与pop序列的头元素p

设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值,push、pop、min三个方法的时间复杂度必须是O(1)

1 /* 2 * 设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值, 3 * push.pop.min三个方法的时间复杂度必须是O(1) 4 * 一种解法是在Stack类里添加一个Int型的minValue,当minValue出栈时,我们会搜索整个栈 5 * 找出最新的最小值,但是却不符合操作时间为O(1)的要求 6 * 如有: 7 * push(4)//最小值:4 8 * push(5)//最小值:4 9 * push(3)//最小值:3 10 * push(1)

【算法】最小栈

实现一个栈,带有出栈(pop).入栈(push).取最小元素(getMin)三个方法,且时间复杂度均为O(1). 初始想法: 创建 int min = -1,记录栈中最小元素的下标: 第一个元素进栈时,min = 0: 每当新元素进栈,让新元素与 min 下标位置的元素比较大小,min = 较小元素的下标: 调用 getMin 直接返回 min 的值. 这种方式进栈没有问题,而出栈时,若当前最小元素在栈顶并出栈了,用剩下哪个元素的下标顶替当前 min 就不得而知了.所以一旦最小元素的下标出栈,需

lintcode 中等题:Min stack 最小栈

题目 带最小值操作的栈 实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值. 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成. 解题 可以定义一个数组或者其他的存储最小值,第i个元素,表示栈中前i个元素的最小值. 定义两个ArrayList来存储栈,一个ArrayList存储当前栈中的元素,一个ArrayList存储最小栈,并且其第i个元素表示栈中前i个元素的最小值,这样两个栈的长度是始终一样的 入栈:最小栈需要加入的元素是 当前要入的元

【LeetCode-面试算法经典-Java实现】【155-Min Stack(最小栈)】

[155-Min Stack(最小栈)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() –