算法通关村第四关-黄金挑战栈的经典问题

这篇具有很好参考价值的文章主要介绍了算法通关村第四关-黄金挑战栈的经典问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

括号匹配问题

描述 : 

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

题目 :

LeetCode 20.有效的括号 : 

20. 有效的括号

算法通关村第四关-黄金挑战栈的经典问题,算法村,算法,leetcode,数据结构

分析 :

本题还是比较简单的,其中比较麻烦的是如何判断两个符号是不是一组的,我们可以用哈希表将所有符号先存储,左半边做key,右半边做value。遍历字符串的时候,遇到左半边符号就入栈,遇到右半边符号就与栈顶的符号比较,不匹配就返回false

解析 :

LeetCode

class Solution {
    public boolean isValid(String s) {
        //创建栈
        Stack<Character> sk = new Stack<>();

        //创建Map
        HashMap<Character,Character> map = new HashMap();
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');

        for(int i =0; i< s.length();i++){
            char c = s.charAt(i);
            //如果是左边就压栈
            if(map.containsKey(c)){
                sk.push(c);
            }else{
                //否则就弹栈,看是否和左边匹配
                
                if(!sk.isEmpty()){
                    if(c != map.get(sk.pop())){
                        return false;
                    }
                }else{
                    //如果栈是空的就不匹配
                    return false;
                }
            }
        }
        
        //如果栈里是空的证明都匹配了 , 栈里不是空的证明有一个单的 不匹配
        return sk.isEmpty();
    }
}

最小栈

描述 :

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

题目 :

LeetCode 155. 最小栈

算法通关村第四关-黄金挑战栈的经典问题,算法村,算法,leetcode,数据结构

分析 :

解题思路:
借用一个辅助栈 min_stack,用于存获取 stack 中最小值。

算法流程:

push() 方法: 每当push()新值进来时,如果 小于等于 min_stack 栈顶值,则一起 push() 到 min_stack,即更新了栈顶最小值;
pop() 方法: 判断将 pop() 出去的元素值是否是 min_stack 栈顶元素值(即最小值),如果是则将 min_stack 栈顶元素一起 pop(),这样可以保证 min_stack 栈顶元素始终是 stack 中的最小值。
getMin()方法: 返回 min_stack 栈顶即可。
min_stack 作用分析:

min_stack 等价于遍历 stack所有元素,把升序的数字都删除掉,留下一个从栈底到栈顶降序的栈。
相当于给 stack 中的降序元素做了标记,每当 pop() 这些降序元素,min_stack 会将相应的栈顶元素 pop() 出去,保证其栈顶元素始终是 stack 中的最小元素。

算法通关村第四关-黄金挑战栈的经典问题,算法村,算法,leetcode,数据结构

注意 : stack.pop().equals(minStack.peek())  不要写成stack.pop() == minStack.peek()

这解法来自 : Krahets - 力扣(LeetCode)

代码 :

class MinStack {

    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public MinStack() {
        this.stack = new Stack<>();
        this.minStack = new Stack<>();
    }
    
    public void push(int val) {
        if(minStack.isEmpty() || val <= minStack.peek()){
            minStack.push(val);
        }
        stack.push(val);
    }
    
    public void pop() {
        if(!stack.isEmpty() && stack.pop().equals(minStack.peek())){
            minStack.pop();
        }
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

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

这关就到这里 , 下期一关见!文章来源地址https://www.toymoban.com/news/detail-726567.html

到了这里,关于算法通关村第四关-黄金挑战栈的经典问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村 —— 滑动窗口经典问题

    目录 滑动窗口经典问题 1. 最长子串专题 1.1 无重复字符的最长子串 1.2 至多包含两个不同字符的最长子串 1.3 至多包含K个不同字符的最长子串 2 长度最小的子数组 3 盛水最多的容器 4 寻找子串异位词 4.1 字符串的排列 4.2 找到字符串中所有字母异位 前面我们已经了解了滑动窗

    2024年02月06日
    浏览(44)
  • 算法通关村第一关——链表经典问题

    剑指office 52题 LeetCode234题 LeetCode 21 LeetCode 23 LeetCode 1669 LeetCode 876 剑指 Offer 22 LeetCode 61 LeetCode 203 LeetCode 19 LeetCode 83 LeetCode 82

    2024年02月14日
    浏览(42)
  • 算法通关村第十四关——解析堆在数组中找第K大的元素的应用

    力扣215题 , 给定整数数组nums和整数k,请返回数组中第k个最大的元素。 请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 分析 :按照“找最大用小堆,找最小用大堆,找中间用两个堆”,这道题用最小堆来解决,构造一个大小只有K的最小堆

    2024年02月07日
    浏览(38)
  • 算法通关村第一关——链表经典问题之双指针笔记

    基本结构 1.寻找中间结点 2.寻找倒数第k个元素 3.旋转链表

    2024年02月14日
    浏览(40)
  • 算法通关村第一关——链表经典问题之双指针专题笔记

    我一直觉得双指针是一个非常好用的方法,在链表中可以使用,在数组中依然可以,很灵活。 1. 寻找中间结点         用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步, fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。 2. 寻找倒数第K个元素 在这

    2024年02月15日
    浏览(41)
  • 算法通关村第一关------链表经典问题之寻找第一个公共子结点

    哈希和集合 栈 拼接两个字符串 同步相消 1、哈希和集合法:         将一个链表存入Map(或者集合)中,然后遍历第二个链表,在遍历的同时,检查在Hash(或者集合)中是否包含此节点。  2、栈方法:         主要思想:栈是后进先出原则,stack.peek()方法每次比较栈顶

    2024年02月12日
    浏览(39)
  • 算法通关村第一关——链表经典问题之第一个公共子节点笔记

    题目:剑指 Offer 52. 两个链表的第一个公共节点 输入两个链表,找出它们的第一个公共节点。 如下面的两个链表: 在节点 c1 开始相交。 链表节点的定义 小技巧: 如果题目刚拿到手的时候没有思路怎么办? 试着将常用的数据结构和常用的算法思想都想一遍,一个一个靠,看

    2024年02月16日
    浏览(49)
  • 算法通关村第一关---链表经典问题之两个链表的第一个公共节点笔记

    源码地址:GitHub-算法通关村 1.hash 2.集合 3.栈 4.双指针

    2024年02月16日
    浏览(44)
  • 算法通关村第一关——链表经典问题之寻找两个链表的第一个公共结点

    这是一道经典的链表问题,来自剑指offer52,题目是这样的:输入两个链表,找出它们的第一个公共结点,如下图所示: 两个链表的头结点均已知,相交之后成为一个单链表,但是相交的位置未知,并且相交之前的结点数也是未知的,请设计算法找到两个链表的合并点。 第一

    2024年02月16日
    浏览(58)
  • 算法通关村第11关【黄金】| 用4KB内存寻找重复元素

    题目要求:给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。 思路: 直接用大小为32000的int数组来标记对应下标下的值出现次数,但是空间大小是32000*4B超过了4KB 这里采用一种压缩

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包