leetcode 之Min Stack



Total Accepted: 15967Total Submissions:103378

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 element in the stack.


class MinStack {
    public void push(int x) {
        
    }

    public void pop() {
        
    }

    public int top() {
        
    }

    public int getMin() {
        
    }
}



class Node {
		int number;
		Node next;
		Node pre;

		Node(int x) {
			this.number = x;
		}
	}

	Node head;
	Node tail;
	int size = 0;

	public void push(int x) {
		if (size == 0) {
			head = new Node(x);
			head.pre = null;
			tail = head;
			tail.next = null;
		} else {
			Node node = new Node(x);
			tail.next = node;
			node.pre = tail;
			tail = node;
			tail.next = null;
		}
		size++;
	}

	public void pop() {
		if (tail.pre != null) {
			tail = tail.pre;
		}
		size--;
	}

	public int top() {
		return tail.number;
	}

	public int getMin() {
		int Min = 0;
		Node t = head;
		while (t.next != null) {
			Min = Min > t.number ? t.number : Min;
			t = t.next;
		}
		return Min;
	}
}


Time Limit Exceeded

第一次time超時


問題:getMin方法時間複雜度太高,問題點在於找一個最方便於查找最小數的數據結構, 不用說也知道這就是數組了。

當最小數被刪除時,它並不一定是處於棧頂的位置,所以雖然說是棧的題。


剛纔靈光一閃。我是不是可以不用棧。。

直接用數組。有一個變量用於記錄當前下標。就可以實現棧的效果。

但是問題仍然在於如何快速的查找到最小值。


用數組的問題是擴充問題

當下標超出數組初始化的時候要進行擴充。如果有必要我們可以在pop加縮減數組大小。但是這裏不是特別需要。



	public void push(int x) {

		if (index + 1 == SIZE) {

			SIZE = SIZE << 1;
			int[] temp = new int[SIZE];
			for (int i = 0; i < index + 1; i++) {
				temp[i] = Number[i];
			}
			Number = temp;
		}
		Number[++index] = x;
		System.out.println(Number[index]);
	}




新方案第一次嘗試。



public class MinStack {

	public static void main(String[] args) {
		MinStack min = new MinStack();
		for (int i = -3; i < 100; i++) {
			min.push(i);
		}
		System.out.println(min.getMin());
	}

	int index = 0;
	int SIZE = 10;
	int[] Number = new int[SIZE];

	public void push(int x) {

		if (index + 1 == SIZE) {

			SIZE = SIZE << 1;
			int[] temp = new int[SIZE];
			for (int i = 0; i < index + 1; i++) {
				temp[i] = Number[i];
			}
			Number = temp;
		}
		Number[++index] = x;
		System.out.println(Number[index]);
	}

	public void pop() {
		index--;

	}

	public int top() {

		return Number[index];
	}

	public int getMin() {
		int result = 0;
		for (int i = 0; i < index; i++) {
			System.out.println(Number[i]);
			result = result > Number[i] ? Number[i] : result;

		}
		return result;

	}

}

結果還是超時了。

數組部分也調到了1000的初始值,所以我認爲應該是getmin方法造成了。

剛纔想到的方案不是去優化排序算法,而是選擇性調用 。

有一個值去做最小值緩存,只有在pop最小值的時候纔再去找最小值

事實證明成功啦~~


總結一下:主要是因爲對棧結構不熟QAQ.然後此算法效率之高也是出乎我的意料。。運算時間小於所有java的代碼,都趕上python了。



public class MinStack {

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

	int index = -1;
	int SIZE = 10;
	int Min = Integer.MAX_VALUE;
	int[] Number = new int[SIZE];

	public void push(int x) {

		if (index + 1 == SIZE) {

			SIZE = SIZE << 1;
			int[] temp = new int[SIZE];
			for (int i = 0; i < index + 1; i++) {
				temp[i] = Number[i];
			}
			Number = temp;
		}
		if (x < Min) {
			Min = x;
		}
		Number[++index] = x;
	}

	public void pop() {
		if (top() == Min) {
			System.out.println("Min" + Number[index]);
			int result = Integer.MAX_VALUE;
			for (int i = 0; i < index; i++) {
				result = result > Number[i] ? Number[i] : result;

			}
			Min = result;
			System.out.println("result" + Min);
		}
		if (index > 0) {
			index--;
		}

	}

	public int top() {
		return Number[index];
	}

	public int getMin() {
		return Min;

	}

}













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章