首页 > 代码库 > 第八节 数据结构

第八节 数据结构

1.栈和队列

  队列:BFS  栈:DFS

  例题:  (1)min stack:

   思路:使用两个栈实现。第二个栈对应相应层为栈顶的最小值。

      更节省空间的方法是:相邻层如果值相同可用计数的机制来节省空间。

   代码 :

public class MinStack {
    Stack<Integer> s;
    Stack<Integer> minStack;
    public MinStack() {
        // do initialize if necessary
        s = new Stack<Integer>();
        minStack = new Stack<Integer>();
    }

    public void push(int number) {
        // write your code here
        s.push(number);
        int cur_min = minStack.isEmpty() ? Integer.MAX_VALUE : minStack.peek();
        minStack.push(Math.min(cur_min, number));
    }

    public int pop() {
        // write your code here
        minStack.pop();
        return s.pop();
    }

    public int min() {
        // write your code here
        return minStack.peek();
    }
}

(2)Largest Rectangle in Histogram     思路:这道题暴力解法的时间复杂度是O(n^2),因此不太可能用动态规划。本题O(n)的解法是使用单调栈。计算以每个柱形为高的最大矩形,称为基于该柱形的最大矩形,这个最大矩形的左右两边一直延伸到两边第一个比当前柱形低的地方。使用单调栈的思想是:在该柱形出栈时计算基于它的最大矩形,并且单调栈保证了它出栈后的下一个栈顶元素是它左边第一个低于它的柱形当前push的使它出栈的柱形 它右边第一个低于它的柱形。计算这两个柱形下标的差值加1就是该最大矩形的宽度。如果它出栈后栈空,说明它的左边没有低于它的柱形,则最大矩形的宽就直接等于当前push的使它出栈的柱形的下标。

     代码:

public class Solution {
    /**
     * @param height: A list of integer
     * @return: The area of largest rectangle in the histogram
     */
    public int largestRectangleArea(int[] height) {
        // write your code here
        int res = 0;
        Stack<Integer> s = new Stack<Integer>();
        
        for (int i = 0; i <= height.length; i++) {
            int cur = i == height.length ? -1 : height[i];
            while (!s.isEmpty() && height[s.peek()] >= cur) {
                int h = height[s.pop()];
                int w = s.isEmpty() ? i : i - s.peek() - 1;
                res = Math.max(res, w * h);
            }
            s.push(i);
        }
        return res;
    }
}

 

  

 

第八节 数据结构