当前位置: 首页 > news >正文

LeetCode 解题思路 30(Hot 100)

在这里插入图片描述

解题思路:

  1. 递归参数: 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。
  2. 递归过程:
  • 当当前路径 path 的长度等于 n * 2 时,说明已经生成有效括号,加入结果集。
  • 若左括号数小于 n,将左括号加入临时字符串,递归处理字符串的下一个位置。
  • 若右括号数小于左括号数,将右括号加入临时字符串,递归处理字符串的下一个位置。

Java代码:

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> result = new ArrayList<>();
        backtrack(n, result, "", 0, 0);
        return result;
    }

    private void backtrack(int n, List<String> result, String path, int open, int close) {
        if (path.length() == n * 2) {
            result.add(path);
            return;
        }

        if (open < n) backtrack(n, result, path + "(", open + 1, close);
        if (close < open) backtrack(n, result, path + ")", open, close + 1);
    }
}

复杂度分析:

  • 时间复杂度: O( 4 n / √ n 4ⁿ/√n 4n/√n)。有效括号组合的数量遵循卡塔兰数,其渐近复杂度为 4 n / √ n 4ⁿ/√n 4n/√n。每个组合需要 O(n) 时间构建,总时间复杂度为 O( 4 n / √ n 4ⁿ/√n 4n/√n)。
  • 空间复杂度: O(n)。递归调用栈的深度最大为 2n,但主要空间消耗来自结果存储,结果集大小为卡塔兰数,空间复杂度为 O( 4 n / √ n 4ⁿ/√n 4n/√n)。算法本身的额外空间复杂度为 O(n)。

在这里插入图片描述

解题思路:

  1. 遍历起点: 从网格的每个单元格出发,尝试匹配单词的第一个字符。
  2. ​递归搜索: 对当前单元格的四个相邻方向(上、下、左、右)进行递归搜索,确保字符匹配且未被访问过。
  3. ​标记访问: 在搜索过程中临时标记已访问的单元格(如将字符改为特殊符号),并在回溯时恢复原状。
  4. 终止条件: 若完整匹配单词的所有字符,返回 true;若所有路径均失败,返回 false。

Java代码:

public class Solution {
    public boolean exist(char[][] board, String word) {
        int rows = board.length;
        int cols = board[0].length;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (dfs(board, word, i, j, 0)) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean dfs(char[][] board, String word, int i, int j, int start) {
        if (i == -1 || i == board.length || j == -1 || j == board[0].length 
            || board[i][j] != word.charAt(start)) {
            return false;
        }

        if (start == word.length() - 1) return true;

        char temp = board[i][j];
        board[i][j] = '#';
        
        boolean found = dfs(board, word, i + 1, j, start + 1)
                     || dfs(board, word, i - 1, j, start + 1)
                     || dfs(board, word, i, j + 1, start + 1)
                     || dfs(board, word, i, j - 1, start + 1);

        board[i][j] = temp;
        return found;
    }
}

复杂度分析:

  • 时间复杂度: 最坏情况下为 O(M×N×4L),M×N 是网格的总单元格数,每个单元格作为起点。4L 是每个起点的最长递归深度(单词长度为 L,每一步有4个方向选择)。
  • 空间复杂度: O(L),递归调用栈的深度最大为单词长度 L。

相关文章:

  • 硬盘分区格式之GPT(GUID Partition Table)笔记250407
  • 【k8s学习之CSI】理解 LVM 存储概念和相关操作
  • 喂饭教程-Dify如何集成RAGFlow知识库
  • [ISP] ISP 中的 GTM 与 LTM:原理、算法与与 Gamma 校正的对比详解
  • Token+JWT+Redis 实现鉴权机制
  • 2024年十五届蓝桥杯青少年Scratch省赛初级组——找不同
  • 极空间NAS进阶玩法:Debian 系统安装教程
  • Docker学习--卷相关命令
  • 瓦片数据合并方法
  • 【R语言绘图】圈图绘制代码
  • 分割回文串 复原IP地址(Java)
  • 光场调制技术在超快激光加工中的应用
  • (高频SQL50题)1667. 修复表中的名字
  • springboot+vue2集成JWT token实现权限验证
  • 如何更好的理解 beforeEach 全局前置守卫,在处理路由跳转前触发,怎么实现常用的全局权限校验、登录状态检查的呢?
  • 深入解析SQL多表查询:核心技巧与实战示例
  • 【前端进阶】可选链与空值合并:接口数据容错处理的最佳实践
  • G-升!龙!_牛客周赛 Round 88
  • 深入源码级别看spring bean创建过程
  • Go语言类型捕获及内存大小判断
  • 李公明︱一周书记:当前科学观中的盲点、危机与……人类命运
  • 市场监管总局召开平台企业支持个体工商户发展座谈会
  • 秘鲁总理辞职
  • 俄副外长:俄美两国将举行双边谈判
  • 字母哥动了离开的心思,他和雄鹿队的缘分早就到了头
  • 从600名外到跻身大满贯,孙发京:走过的路成就了现在的我