第八节 数据结构
Posted coldyan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八节 数据结构相关的知识,希望对你有一定的参考价值。
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; } }
以上是关于第八节 数据结构的主要内容,如果未能解决你的问题,请参考以下文章
萌新向Python数据分析及数据挖掘 第一章 Python基础 第八节 函数