首页 > 其他分享 >LeetCode 刷题 —— 辅助栈

LeetCode 刷题 —— 辅助栈

时间:2023-05-13 23:35:42浏览次数:54  
标签:minStack int height Stack push 辅助 leftWallStack LeetCode 刷题


 42. 接雨水

class Solution {
    public int trap(int[] height) {
        int res = 0;
        Stack<Integer> leftWallStack = new Stack();
        int len = height.length;
        leftWallStack.push(0);
        for (int i=1;i<len;i++) {
            int rightWallIndex = i;
            int stackTopIndex = leftWallStack.peek();
            // 栈顶元素要当底部,右边出现比栈顶元素高的,那么它就可以顺利当底部。可以出栈了
            while (!leftWallStack.isEmpty() && height[rightWallIndex] > height[stackTopIndex]) {
                 // 出栈
                leftWallStack.pop();
                if (leftWallStack.isEmpty()) {
                    break;
                }
                // 栈的下一个元素要当左边的墙
                int leftWallIndex = leftWallStack.peek();
                // 左边的墙也要比出栈的容器底部高,才可以接到雨水
                if (height[leftWallIndex] > height[stackTopIndex]) {
                    int h = Math.min(height[leftWallIndex], height[rightWallIndex]) - height[stackTopIndex];
                    int w = rightWallIndex - leftWallIndex - 1;
                    res = res + h*w;
                }
                stackTopIndex = leftWallIndex;
            }
            // 不管怎么样,用来比较的右边新元素每次都要入栈
            leftWallStack.push(i);
        }
        return res;
    }

 

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

用一个辅助栈 minStack,记录当前最小的元素

push: 如果当前加入的元素比 minStack 的小【或等于,为什么要有等于看代码注释】,就把这个元素也 push 进入 minStack

pop: 从主栈弹出,如果主栈弹出的这个元素和 minStack 相等,说明这个最小的已经走了,minStack 也要 pop 弹出

top:主栈的栈顶(peek)

min: 辅助栈 minStack 的栈顶(peek)

class MinStack {

    private Stack<Integer> mainStack;

    private Stack<Integer> minStack;

    /** initialize your data structure here. */
    public MinStack() {
        mainStack = new Stack();
        minStack = new Stack();
    }
    
    public void push(int x) {
        mainStack.push(x);
        if (minStack.isEmpty()) {
            minStack.push(x);
        }
        // minStack 放的是当前最小,因此只有新入的元素比 minStack 栈顶小,才入栈
        // 一定要注意这里要加 = 否则有重复最小元素,只入栈了一个的话,那 pop 的时候这个出栈,之后 minStack.peek() 就会报错 
        else if (x <= minStack.peek()) {
            minStack.push(x);
        }
    }
    
    public void pop() {
        int top = mainStack.pop();
        // 主栈出栈的时候,如果 minStack 栈顶与主栈栈顶相同,它也要出栈
        if (top == minStack.peek()) {
            minStack.pop();
        }
    }
    
    public int top() {
        return mainStack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */

 

标签:minStack,int,height,Stack,push,辅助,leftWallStack,LeetCode,刷题
From: https://www.cnblogs.com/suBlog/p/17398501.html

相关文章

  • #yyds干货盘点# LeetCode面试题:乘积最大子数组
    1.简述:给你一个整数数组nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位整数。子数组是数组的连续子序列。 示例1:输入:nums=[2,3,-2,4]输出:6解释: 子数组[2,3]有最大乘积6。示例......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的层序遍历
    题目:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。 示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]代码实现:classSolution{publicList<List<Integer>>......
  • 【LeetCode剑指offer#04】包含min函数的栈、栈的压入、弹出序列(辅助栈的应用)
    包含min函数的栈https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。示例:MinStackminStack=newMinStack();minStack.push(-2);......
  • 【Leetcode算法01】双指针Two Pointers
    TableofContents同向双指针剑指offer05.替换空格相向双指针344.反转字符串206.反转链表151.翻转字符串里的单词19.删除链表的倒数第N个节点160.相交链表142.环形链表II15.三数之和18.四数之和快慢双指针27.移除元素Solutions27.移除元素力扣题......
  • 4. LeetCode 367. 有效的完全平方数
     代码:classSolution{public:boolisPerfectSquare(intnum){longlonga=(longlong)num;longlongleft=0;longlongright=a;while(left<=right){longlongmid=left+((right-left)>>......
  • 【LeetCode数据结构04】字符串String
    TableofContents双指针344.反转字符串541.反转字符串II剑指Offer05.替换空格151.翻转字符串里的单词剑指Offer58-II.左旋转字符串KMP28.实现strStr459.重复的子字符串Solutions344.反转字符串力扣题目链接思路代码541.反转字符串II......
  • C语言刷leetcode——贪心
    目录贪心刷题252.会议室(P)253.会议室II(P)1353.最多可以参加的会议数目贪心找到贪心策略,使得:局部最优解-->整体最优解刷题252.会议室(P)253.会议室II(P)#defineMAX1000001intminMeetingRooms(int**intervals,intintervalsSize,int*intervalsColSize){......
  • 3. LeetCode 69. x的平方根
      代码:classSolution{public:intmySqrt(intx){longlonga=(longlong)x;longlongleft=0;longlongright=a;while(left<=right){longlongmid=left+((right-left)>>1);......
  • 【华为HCIP | 高级网络工程师】刷题日记(5)
    文章目录每日刷题30道1、已知路由器R1存在Loopback0且地址为1.1.1.1/32,在使能OSPF并引入直连路由时会把该环回口引入。那么以下哪一项的配置能够实现在引入直连路由时,Loopback0不会被引入,并能够保证其他直连路由引入到OSPF内?2、在MA网络中的两台DRother路由器R1和R2建立邻居关系,那......
  • 【华为HCIP | 高级网络工程师】刷题日记(4)
    文章目录每日刷题30道1、在OSPF中部署Filter-Policy时,Filter-Policy会修改该OSPF的LSDB。2、如图所示,R1和R2已在BFD中配置了本端发送时间间隔和本端接收时间间隔及本端的BFD检测倍数。现R1和R2采用异步模式检测,那么R1实际检测时间是多少?3、USG防火墙上存在多个默认安全区域,其中Unt......