算法通关村第四关|白银|栈的经典算法问题【持续更新】

1.括号匹配问题

1.1 有效的括号:用哈希表的 key 存储左半边符号,用 value 存储右半边符号,然后用栈去匹配左右括号,注意不仅要左右括号类型匹配,数量也要匹配。

java 复制代码
public boolean isValid(String s) {
	if (s.length() <= 1) {
        return false;
	}
	Map<Character, Character> smap = new HashMap<>();
	smap.put('(', ')');
	smap.put('{', '}');
	smap.put('[', ']');

	Stack<Character> stack = new Stack();
	for (int i = 0; i < s.length(); i++) {
        char item = s.charAt(i);
        // 左括号就直接入栈
        if (smap.containsKey(item)) {
            stack.push(item);
        } else {// 右括号就进行判断
            // 栈不为空才进行下一步判断,栈为空直接返回false
            if (!stack.isEmpty) {
                Character left = stack.pop();
                char right = smap.get(left);
                if (right != item) {
                    return false;
                }
            } else {
                return false;
            }
        }
    }
	// 循环结束以后如果栈里还有左括号,则返回false
	return stack.isEmpty();
}

1.2 有效括号生成:【持续更新】。

1.3 最长有效括号:【持续更新】。

2.最小栈

设计一个能在常数时间内检索到最小元素的栈。

java 复制代码
class MinStack {
    Deque<Integer> xStack;
    Deque<Integer> minStack;

    public MinStack() {
        xStack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE);
    }

    public void push(int x) {
        // 这里用LinkedList表示栈,使用push方法,后续同理
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x));
    }

    public void pop() {
        xStack.pop();
        minStack.pop();
    }

    public int top() {
        return xStack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}

3.最大栈

设计一个支持查找或弹出栈中最大元素的栈。

java 复制代码
class MaxStack {
    Stack<Integer> stack;
    Stack<Integer> maxStack;

    public MaxStack() {
        stack = new Stack();
        maxStack = new Stack();
    }

    public void push(int x) {
        int max = maxStack.isEmpty() ? x : Math.max(maxStack.peek(), x);
        stack.push(x);
        maxStack.push(max);
    }

    public int pop() {
        maxStack.pop();
        return stack.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int peekMax() {
        return maxStack.peek();
    }

    public int popMax() {
        int max = peekMax();
        Stack<Integer> buffer = new Stack();
        while (top() != max) {
            buffer.push(pop());
        }
        // 把最大值弹出
        pop();
        while (!buffer.isEmpty()) {
            push(buffer.pop());
        }
        return max;
    }
}

如果对您有帮助,请点赞关注支持我,谢谢!❤

如有错误或者不足之处,敬请指正!❤

个人主页:星不易

算法通关村专栏:不易|算法通关村

相关推荐
爱笑的源码基地9 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
CV-Climber10 小时前
检索技术的实际应用
人工智能·算法
hhzz11 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
莫逸风11 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_11 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
TsingtaoAI12 小时前
3D高斯泼溅技术发展及其在具身智能领域的应用综述
人工智能·算法·ai·具身智能·高斯泼溅
atunet12 小时前
关于图算法中的连通分量检测与最小割问题7
算法
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
心运软件12 小时前
银行客户流失预测(Python 完整实战)
算法
邪神与厨二病12 小时前
牛客周赛 Round 153
python·算法