20200726笔记.栈,辅助栈,(20.155)

菜鸡的笔记,没有阅读价值

(1)leecode20题,
元素:栈
收获:
1.要求匹配相对应的(),{},[]。用map来解决有关配对的问题。
2.条件表达式
关系表达式 ? 表达式1:表达式2
根据关系表达式的布尔值决定取值,true时取表达式1,false取2.
java中条件运算表达式的关系表达式的类型必须为布尔类型,即只能是true和false
3.ArrayList a没法直接调用a[i],要用a.get(index).

(2)leecode155题,
元素:栈
自己的方法存在的问题(待解决)
我想用一个标识变量记录此时的最小值是不是栈顶刚压入的元素,在这个标志flag为真的时候好写,但是在他为假时存在一些难以描述的问题,有的测试用例过不去。在这里插入图片描述public void pop()
{ //存在问题,我不知道怎么办了2020.07.26 12:28
if(array.size()==0) {
System.out.println(“栈为空,无法弹出元素”);
}else if(flag == true){
array.remove(array.size()-1);
nowmin = lastmin;
} //else if(array.get(array.size()-1)==nowmin) {
//nowmin = lastmin;
//array.remove(array.size()-1);
//}
else if(flag == false) {
array.remove(array.size()-1);
}
}
我觉得就是在弹出一个是最小值的元素时,此时flag为假,这两个分支存在了什么冲突,我没想明白怎么改好,感觉这个思路应该没什么问题,等着过几天再看看吧。

leecode给出的答案
一 运用辅助栈,
我们可以在每个元素 a 入栈时把当前栈的最小值 m 存储起来。在这之后无论何时,如果栈顶元素是 a,我们就可以直接返回存储的最小值 m。我们只需要设计一个数据结构,使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。
1.当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
2.当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;
3.在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

另一种思路,用一个站同时保存一个二元组,分别是新的元素和此时对应的最小值

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> min_stack;
    public MinStack() {
        stack = new Stack<>();
        min_stack = new Stack<>();
    }
    public void push(int x) {
        stack.push(x);
        if(min_stack.isEmpty() || x <= min_stack.peek())
            min_stack.push(x);
    }
    public void pop() {
        if(stack.pop().equals(min_stack.peek()))
            min_stack.pop();
    }
    public int top() {
        return stack.peek();
    }
    public int getMin() {
        return min_stack.peek();
    }
}




辅助栈这种思想清晰多了,不用设置一堆标致变量
主要思想差别就是是用一个变量来记录最小值还是用一个栈来记录不同时可不同情况的最小值



**第二种精妙的方法**
这个感觉非常巧妙,慢但是很节省空间,体现了用一个元素达到其他元素的目的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020072613065439.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk5MzQxMg==,size_16,color_FFFFFF,t_70)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值