两道经典算法题复盘:最长有效括号 & 不同路径

前言

今天复盘两道算法题:一道是困难级别的栈 / 动态规划题「最长有效括号」 ,另一道是中等难度的多维动态规划题「不同路径」。这两道题分别代表了栈的应用和二维 DP 的经典场景,很适合作为面试复习的重点。


一、32. 最长有效括号(困难)

题目描述

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

核心思路:栈解法(直观好写)

栈是解决这类括号匹配问题的经典数据结构,这道题的关键在于用栈记录 "上一个有效位置"

  • 栈底始终保存一个无效位置 (初始为 -1),作为计算长度的基准。
  • 遇到 '(',直接压入当前索引;
  • 遇到 ')',弹出栈顶元素:
    • 如果栈为空,说明当前 ')' 没有匹配的 '(',将当前索引压入作为新的无效位置;
    • 如果栈不为空,当前有效长度 = 当前索引 - 栈顶索引,更新全局最大值。

完整代码(Java)

java

运行

复制代码
class Solution {
    public int longestValidParentheses(String s) {
        Deque<Integer> stack = new LinkedList<>();
        stack.push(-1);
        int maxLen = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else {
                stack.pop();
                if (stack.isEmpty()) {
                    stack.push(i);
                } else {
                    maxLen = Math.max(maxLen, i - stack.peek());
                }
            }
        }
        return maxLen;
    }
}

坑点与优化

  1. 栈底的 -1 是关键:没有这个初始值,第一次匹配时无法计算长度,会导致数组越界或结果错误。
  2. 动态规划解法补充 : 定义 dp[i] 表示以 i 结尾的最长有效括号长度。
    • s[i] == ')'s[i-1] == '('dp[i] = dp[i-2] + 2
    • s[i] == ')'s[i-1] == ')'s[i - dp[i-1] - 1] == '('dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2]
  3. 时间复杂度:栈和 DP 解法都是 O (n),空间复杂度栈解法为 O (n),DP 解法为 O (n)。

二、62. 不同路径(中等)

题目描述

一个机器人位于一个 m x n 网格的左上角(起点),每次只能向下或向右移动一步,请问到达右下角(终点)共有多少条不同的路径?

核心思路:二维动态规划

这是最经典的二维 DP 入门题,核心思想是:

  • 定义 dp[i][j] 表示到达 (i, j) 位置的不同路径数。
  • 边界条件:第一行和第一列的所有位置都只有 1 条路径(只能一直向右或一直向下)。
  • 状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1](只能从上方或左方移动过来)。

完整代码(Java)

java

运行

复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++) {
            dp[0][j] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
}

优化与拓展

  1. 空间优化(一维 DP) : 因为每次更新只需要上一行和当前行的信息,可以将二维数组压缩为一维:

    java

    运行

    复制代码
    class Solution {
        public int uniquePaths(int m, int n) {
            int[] dp = new int[n];
            Arrays.fill(dp, 1);
            for (int i = 1; i < m; i++) {
                for (int j = 1; j < n; j++) {
                    dp[j] = dp[j] + dp[j-1];
                }
            }
            return dp[n-1];
        }
    }
  2. 数学方法(组合数) : 从起点到终点,一共需要走 m+n-2 步,其中 m-1 步向下,n-1 步向右。路径数就是组合数 C(m+n-2, m-1),可以用公式直接计算。

相关推荐
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局2 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象2 天前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局2 天前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局2 天前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
统计实现局2 天前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法