【纯新-剑指offer day1】offer09和30

1.剑指 Offer 09. 用两个栈实现队列

第一眼完全没看懂题呢!

反思:该题没有考虑到把stack1的内容pop到stack2中之后stack1就空了。必须加stack2栈空的判断,这样第二次删除可以直接从stack2输出。

怎么做:

        1.Stack

        2.Deque

        双端数列。Java数据结构之Deque(双端队列)_Jason&Zhou的博客-CSDN博客_deque(双端队列)也可以用作lifo(后进先出)堆栈(也就是栈),last in first o

        3.LinkedList

Java LinkedList | 菜鸟教程

LinkedListAPI方法大全

        总而言之是个链表,且有实现队列、栈等的接口。

        在这里链表不需要考虑数组的扩容问题,故效率会比较不错。 原因的话是Stack继承了Vector接口,而Vector底层是一个Object[]数组,那么就要考虑空间扩容和移位的问题了。(来自评论区大佬)

不熟的知识点:

LinkedList(Collection<? extends E> c):

        构造一个包含指定 collection 中的元素的列表
        这些元素按其 collection 的迭代器返回的顺序排列。 

        1.Collection 集合:

        属于单列集合的顶层接口。与数组不同,长度可变且存储的都是引用数据类型。如果想存储基本类型数据需要存储对应的包装类型。分为可重复的List和不可重复的Set。

Collection集合用法详解

        2.泛型:

        <>,就是指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义。会在编译期检查类型是否错误。

public class MyClass<T> {T value1;}

        类声明后的<>中这个T被称为类型参数,用于指代任意类型。实际上这个T只是个代表,写什么都可以。表示此时的value1,value2都是在类定义时没有明确类型,只有在使用时才告知编译器类型。出于规范,类型参数用单个的大写字母来代替。

        常见如下:T任意类,E异常或者Element,K与V搭配使用。

        通配符:
        <?> 一般用在方法参数,表示可以接受该类所有类型的泛型变量。
        <? extends 类> 表示?可以指代任何类型
        但是该类型必须是后面类的子类。此时?可以指代任意E类及其子类的类型。

泛型详解泛型的好处

2.剑指 Offer 30. 包含min函数的栈

经过第一题后第二题理所当然地想用LinkedList做...但此时还不知道PriorityQueue的我写的十分冗余...

反思:第一时间应该是思考,而不是翻开API方法开始找方法。

怎么做

整体思路:记录当前链表的min,每push一个就新增一个”当前最小结点“。

1.Node(需自己定义)

2.Queue

3.LinkedList

4.PriorityQueue

5.int Min 评论区大佬利用栈来存储上一个最小值 很妙

class MinStack {
public:
    /** initialize your data structure here. */
    int Min=INT_MAX;
    stack<int> st;
    MinStack() {

    }
    void push(int x) {
        st.push(Min);//加入上一个最小值
        if(x<Min) Min=x;//更新最小值
        st.push(x);//加入该数值
    }
    
    void pop() {
        st.pop();//pop掉该数值
        Min=st.top();//得到去掉该值后的最小值
        st.pop();//将该最小值也pop掉
    }
    
    int top() {
        return st.top();//返回栈顶即可
    }
    
    int min() {
        return Min;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值