第八节 数据结构

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;
    }
}

  

时间: 2024-11-03 05:43:25

第八节 数据结构的相关文章

【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助. 2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格.“朱兆祺STM32手记”(http://bb

第八节课:基本数据结构习题

##习题1: 列表a = [11,22,24,29,30,32] 1 把28插入到列表的末端 a.append(28) 2 在元素29后面插入元素57 >>> a = [11,22,24,29,30,32] 3 >>> a.insert(a.index(29)+1,57) >>> a [11, 22, 24, 29, 57, 30, 32] 3 把元素11修改成6 a[0] = 6 a[a.index(11)] = 6 3 删除元素32 del a[a

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定.链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢.不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构.它可以通过一

JAVA Stop The World 第八节

JAVA Stop The World 第八节 小伙伴还记得上一篇中我们留下的一个问题吗?什么是停顿类型!经过上几章的学习,我们知道垃圾回收首先是要经过标记的.对象被标记后就会根据不同的区域采用不同的收集方法.看上去很完美的一件事情,其实并不然. 大家有没有想过一件事情,当虚拟机完成两次标记后,便确认了可以回收的对象.但是,垃圾回收并不会阻塞我们程序的线程,他是与当前程序并发执行的.所以问题就出在这里,当GC线程标记好了一个对象的时候,此时我们程序的线程又将该对象重新加入了“关系网”中,当执行二

20172302 《程序设计与数据结构》第三周学习总结

学号20172302 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容总结 1.对对象创建和对象引用变量的声明及初始化有了了解,再就是了解到别名这一概念,还知道了Java的自动执行垃圾回收的操作. 2.第二节了解了String类的具体的提供的一些方法,从后面的包的概念中了解到String类所归属的包为java.lang,由于其是最基本的包,内嵌于程序中,可以直接使用. 3.在包的这一节认识了几种常见常用的包,以及包中的类在使用的时候用使用import声明. 4.然后四

野生前端的数据结构基础练习(5)——散列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Hash 散列的基本知识 定义 哈希表是一种根据关键码去寻找值的数据映射结构,最直观的应用就是字典(现实的字典,不是数据结构的字典概念). 特点: 插入,删除,取用较快,查找较慢(例如查询最值,需要借助其他数据结构来提升效率). 散列函数应

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.

数据结构Set和Map

一.数据结构 Set 集合的基本概念:集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中.  特点:key 和 value 相同,没有重复的 value.ES6 提供了数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. 1. 如何创建一个 Set const s = new Set([1, 2, 3]); 2.属性 console.log(s.size); // 3 3.Set 类的方法 --set.add(v