You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java括号匹配代码功能正常但运行超时无法通过,求性能优化方案

性能瓶颈原因

  • Stack.add(0, c)操作时间复杂度过高。Java的Stack底层基于Vector实现,在头部插入元素需要将所有已有元素后移一位,单次插入时间复杂度是O(n),循环插入N个元素总时间复杂度达到O(N²),数据量大的时候运行速度会大幅下降。
  • 存在冗余的数据结构和遍历操作。标准括号匹配问题仅需要1个栈做1次正序遍历即可完成,你额外多初始化了1个栈,还多做了1次全量输入的倒序转存操作,带来了很多不必要的性能开销。
  • java.util.Stack本身存在同步开销。Stack是线程安全类,所有方法都带synchronized修饰,单线程判题场景下不需要同步逻辑,额外的锁操作会拖慢运行速度。

优化方案

直接使用单个ArrayDeque做正序遍历即可,时间复杂度降到O(N),空间复杂度保持最坏O(N),性能可以满足绝大多数判题场景的要求。
优化后代码如下:

import java.util.ArrayDeque;
import java.util.ArrayList;

public class Dyck {
    public boolean checkParentheses(ArrayList<Character> input) {
        ArrayDeque<Character> stack = new ArrayDeque<>();
        for (char c : input) {
            // 左括号直接入栈
            if (c == '(' || c == '[') {
                stack.push(c);
                continue;
            }
            // 遇到右括号时栈为空,直接返回不匹配
            if (stack.isEmpty()) {
                return false;
            }
            char top = stack.pop();
            // 括号类型不匹配直接返回false
            if ((c == ')' && top != '(') || (c == ']' && top != '[')) {
                return false;
            }
        }
        // 遍历完所有字符后栈为空才完全匹配
        return stack.isEmpty();
    }
}

如果需要进一步压榨性能,可以将增强for循环替换为普通下标for循环遍历ArrayList,减少迭代器的额外开销。

内容的提问来源于stack exchange,提问作者Fakutzki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:45:00