经典算法

14 条
kmp算法
KMP算法用于在一个文本串 text 中查找模式串 pattern 是否出现,以及出现的位置。 它的关键点是通过 部分匹配表(前缀函数 / LPS数组) 来避免重复比较,从而将时间复杂度降低到 O(n + m)。
爬楼梯
假设你正在爬楼梯。 需要 n 阶你才能到达楼顶。 每次你可以爬: 1 阶 2 阶 问: 一共有多少种不同的方法可以爬到楼顶?
背包问题
给定: 一个容量为 W 的背包 n 个物品 每个物品有: 重量 weight 价值 value 要求: 在不超过背包容量的情况下, 让背包中的总价值最大。
打家劫舍
“打家劫舍”是经典的动态规划(Dynamic Programming)问题。 题目描述: 一个小偷准备偷窃沿街的房屋,每间房屋都有一定金额。 由于相邻房屋安装了联动报警系统,因此不能连续偷两间相邻房屋。 求在不触发警报的情况下,最多能偷多少钱。
最大子数组和
“最大子数组和”是经典动态规划问题,也叫: 连续子数组最大和 Kadane 算法(卡丹算法) 题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
最长递增子序列
最长递增子序列(LIS)是经典动态规划问题。 题目描述: 给定一个整数数组 nums, 找到其中最长严格递增子序列的长度。 注意: 子序列不要求连续 但元素顺序不能改变
最长公共子序列
最长公共子序列(LCS)是经典的动态规划问题。 题目描述: 给定两个字符串 text1 和 text2,返回它们的最长公共子序列的长度。 注意: 子序列:可以不连续,但必须保持相对顺序 公共:必须同时出现在两个字符串中
编辑距离
编辑距离是经典的动态规划问题,也叫: Levenshtein Distance(莱文斯坦距离) 题目描述: 给定两个字符串 word1 和 word2, 计算将 word1 转换成 word2 所需的最少操作数。 允许的操作: 插入一个字符 删除一个字符 替换一个字符
零钱兑换
“零钱兑换”是经典的动态规划(Dynamic Programming)问题。 题目描述: 给定不同面额的硬币 coins 和一个总金额 amount,求凑出该金额所需的最少硬币数。 如果无法凑出,返回 -1。 特点: 每种硬币可以使用无限次(完全背包问题) 求“最小值”
股票买卖
股票买卖”是经典贪心 / 动态规划问题。 题目通常有多个变种,这里先讲最基础版本: 给定一个数组 prices,其中 prices[i] 表示第 i 天股票价格。 你只能买入一次并卖出一次,求最大利润。 要求: 只能交易一次 必须先买后卖
前缀和
前缀和是非常基础且高频的算法技巧,用于快速计算区间和。 核心思想: 用一个数组 preSum 预先记录“从起点到当前位置的累加和”,从而把区间求和从 O(n) 优化到 O(1)。
最长无重复子串
“最长无重复子串”是经典的字符串 + 滑动窗口问题。 题目描述: 给定一个字符串 s,找出其中不包含重复字符的最长子串的长度。 特点: 子串必须是连续的 不能包含重复字符 常用解法:滑动窗口(双指针)
最小覆盖子串
“最小覆盖子串”是经典的滑动窗口 + 哈希计数问题。 题目描述: 给定字符串 s 和 t,在 s 中找出包含 t 所有字符的最短子串,如果不存在则返回空字符串。 特点: 子串必须覆盖 t 中所有字符(包括重复次数) 使用滑动窗口动态调整区间
接雨水
“接雨水”是经典的数组 + 双指针 / 动态规划 / 单调栈问题。 题目描述: 给定一个非负整数数组 height,表示每个位置的柱子高度,宽度为 1。 计算下雨后能接多少水。