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

卡特兰数在LeetCode刷题中的5种经典应用场景(附Python代码)

卡特兰数在LeetCode刷题中的5种经典应用场景(附Python代码)

卡特兰数(Catalan Numbers)是组合数学中一个既优美又实用的数列,它在算法问题中扮演着重要角色。对于准备技术面试的开发者来说,掌握卡特兰数的应用场景能快速解决一类特定问题。本文将聚焦LeetCode高频题型,通过5个经典场景展示如何识别卡特兰数特征并实现高效解题。

1. 括号生成问题

LeetCode第22题「括号生成」是卡特兰数的典型应用。要求生成所有有效的n对括号组合,其总数正是第n个卡特兰数。

问题特征识别

  • 需要生成所有合法排列而非计数时,通常需要回溯法
  • 仅需计数时,可直接套用卡特兰数公式
  • 合法条件:任意前缀中左括号数≥右括号数

Python实现模板

def generateParenthesis(n): def backtrack(s, left, right): if len(s) == 2*n: res.append(s) return if left < n: backtrack(s+'(', left+1, right) if right < left: backtrack(s+')', left, right+1) res = [] backtrack("", 0, 0) return res # 计数版(卡特兰数公式) def catalan(n): from math import comb return comb(2*n, n) // (n + 1)

复杂度对比

方法时间复杂度空间复杂度
回溯法O(4^n/√n)O(n)
公式法O(1)O(1)

提示:面试中若只需计数,直接给出卡特兰数结果能显著提升解题效率

2. 二叉树形态计数

LeetCode第96题「不同的二叉搜索树」要求计算由n个节点组成的BST数量,这正是卡特兰数的定义。

问题转化技巧

  1. 选定根节点后,左右子树节点数之和为n-1
  2. 总方案数=Σ(左子树方案×右子树方案)
  3. 递推式与卡特兰数定义完全一致

动态规划解法

def numTrees(n): dp = [0]*(n+1) dp[0] = dp[1] = 1 for i in range(2, n+1): for j in range(i): dp[i] += dp[j] * dp[i-j-1] return dp[n] # 数学优化版 def numTrees_math(n): from math import comb return comb(2*n, n) // (n + 1)

典型变式题目

  • LeetCode 95:生成所有BST(需要实际构建树)
  • LeetCode 894:所有可能的满二叉树

3. 栈排序问题

栈操作相关的计数问题往往隐藏着卡特兰数。例如「合法的出栈顺序总数」就是经典场景。

LeetCode关联题目

    1. 验证栈序列(验证合法性)
  • 面试题03.05. 栈排序(排序方案数)

特征识别模式

  • 操作序列包含等量的push/pop
  • 任意前缀中push次数 ≥ pop次数
  • 这与括号问题的限制条件同构

Python模拟解法

def validateStackSequences(pushed, popped): stack = [] i = 0 for num in pushed: stack.append(num) while stack and stack[-1] == popped[i]: stack.pop() i += 1 return not stack # 计数公式 def stackPermutations(n): return catalan(n)

4. 不相交弦问题

在圆周上标记2n个点,用n条不相交的弦连接这些点,求方案总数。这是卡特兰数的几何解释。

LeetCode变形题

    1. 不相交的握手(会员题)
  • 多边形三角剖分问题

解题思路拆解

  1. 固定一个点作为弦的端点
  2. 将圆分成两个部分,避免弦交叉
  3. 递推公式:f(n) = Σf(i)*f(n-i-1)

Python实现

def chordCount(n): dp = [0]*(n+1) dp[0] = 1 for i in range(1, n+1): for j in range(i): dp[i] += dp[j] * dp[i-j-1] return dp[n]

5. 路径不越界问题

在n×n网格中从(0,0)到(n,n)不越过对角线的路径数,对应第n个卡特兰数。

LeetCode代表题目

    1. 不同路径(基础版)
    1. 不同路径 II(带障碍物)
    1. 不同路径 III(进阶版)

卡特兰数适用条件

  • 网格必须是n×n正方形
  • 路径不允许越过主对角线
  • 每步只能向右或向上移动

路径计数实现

def uniquePaths(n): from math import comb return comb(2*n, n) - comb(2*n, n-1) # 动态规划版 def uniquePathsDP(n): dp = [[1]*(n+1) for _ in range(n+1)] for i in range(1, n+1): for j in range(i+1, n+1): dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[n][n]

性能对比表

方法n=5n=10n=20
组合公式0.01ms0.01ms0.01ms
动态规划0.05ms0.21ms3.4ms

实战技巧与优化策略

识别卡特兰数问题的关键在于发现递归子结构。当问题满足以下特征时,应考虑卡特兰数解法:

  1. 分治特性:问题可分解为相似的子问题
  2. 乘法原理:整体方案数为各子问题方案数的乘积
  3. 加法原理:需要汇总所有可能的分割方式

记忆化实现模板

from functools import lru_cache @lru_cache(maxsize=None) def catalan(n): if n <= 1: return 1 res = 0 for i in range(n): res += catalan(i) * catalan(n-1-i) return res

预处理卡特兰数表(适合多次查询):

def precompute_catalan(max_n): catalan = [1]*(max_n+1) for i in range(2, max_n+1): catalan[i] = catalan[i-1]*(4*i-2)//(i+1) return catalan

在算法竞赛或面试中,对卡特兰数问题的处理可分为三个层次:

  1. 初级:识别问题模式,直接套用公式
  2. 中级:实现动态规划解法,理解递推关系
  3. 高级:改造问题使其符合卡特兰数模型
http://www.jsqmd.com/news/571629/

相关文章:

  • Ostrakon-VL-8B保姆级教程:Streamlit Theming定制品牌色像素UI主题包
  • XTDrone仿真环境配置踩坑实录:我是如何解决Gazebo插件冲突和MAVROS地理库安装失败的
  • MySQL不同隔离级别下,都会使用什么锁?
  • 从内存分区到智能指针:C++面试中的内存管理全攻略
  • 2026年PVC塑胶地板厂家:解读行业三大核心趋势 - 速递信息
  • 探索DeepCAD:AI驱动的三维CAD模型智能生成革命
  • 快速验证openclaw安装:用快马AI一键生成环境配置脚本原型
  • MacOS+PadOS双端党必看:Zotero搭配坚果云同步文献的5个隐藏技巧
  • Phi-4-mini-reasoning+ollama推理性能横评:对比Qwen2.5与Phi-3-mini
  • 大模型风口已至!普通人如何逆袭拿高薪?学员真实案例告诉你答案!
  • Postman便携版:Windows环境下API开发的免安装解决方案
  • 丹青幻境保姆级教程:LoRA卷轴版本管理与热更新机制在生产环境落地
  • 实战复盘:我是如何用CobaltStrike的Socks4代理+Proxychains穿透内网扫描的
  • 美团外卖超时怎么补偿?周末五折外卖帮你省回损失 - 资讯焦点
  • 华勤技术通过上市聆讯:2025年营收1714亿 净利41亿
  • 2026年贵州交通标志杆采购避坑指南,低价陷阱要当心 - 精选优质企业推荐榜
  • Flutter项目打包未签名ipa的保姆级教程(含Xcode配置与常见错误解决)
  • SQLCoder模型压缩:剪枝技术应用效果
  • 5分钟掌握网页视频下载:猫抓扩展让你轻松获取在线资源
  • 解决Winform MenuStrip默认选中色太丑的问题:3种自定义方案对比
  • 春联生成模型-中文-base:5分钟快速部署,小白也能轻松定制专属春联
  • Python多进程内存爆炸真相:shared_memory vs multiprocessing.Manager性能实测(12GB→287MB优化案例)
  • CoPaw目标检测应用指南:结合YOLOv8实现图像智能分析
  • RexUniNLU与LangChain协同工作的金融文档处理系统
  • 【实战指南】League Akari:英雄联盟智能工具全解析
  • Windows系统SID全解析:从查看到修改的5种实用方法(附工具推荐)
  • 5步打造你的暗黑破坏神2智能助手:游戏自动化脚本新手配置教程
  • Linux管道文件实战:从匿名到命名的进程通信全解析
  • MIT Cheetah开源代码学习笔记:从简化动力学模型到浮动基座,手把手梳理核心算法
  • G-Helper终极指南:如何用轻量工具延长华硕笔记本电池寿命50%