
有时候,很难一眼看出一道题是贪心还是 DP。
前言
为方便大家练习,我把比较套路的贪心题目放在前面,更灵活的思维题和构造题放在后面。每个小节的题目均按照从易到难的顺序排列。
如果做题时没有思路,推荐看看本文第五章的「思考清单」。
一、贪心策略
有两种基本贪心策略:
- 从最小/最大开始贪心,优先考虑最小/最大的数,从小到大/从大到小贪心。在此基础上,衍生出了反悔贪心。
- 从最左/最右开始贪心,思考第一个数/最后一个数的贪心策略,把 个数的原问题转换成 个数(或更少)的子问题。
贪心题目的代码往往比较简单,重点是如何证明贪心算法的正确性。
§1.1 从最小/最大开始贪心
优先考虑最小/最大的数,从小到大/从大到小贪心。
如果答案与数组元素顺序无关,一般需要排序。排序后,可以遍历计算。
- 3074. 重新分装苹果 1198
- 3545. 不同字符数量最多为 K 时的最少删除数 1211
- 3745. 三元素表达式的最大值 1218
- 2279. 装满石头的背包的最大数量 1249
- 1833. 雪糕的最大数量 1253
- 2144. 打折购买糖果的最小开销 1261
- 1005. K 次取反后最大化的数组和 1275
- 1481. 不同整数的最少数目 1284
- 1403. 非递增顺序的最小子序列 1288
- 3010. 将数组分成最小总代价的子数组 I 1292
- 1338. 数组大小减半 1303
- 1710. 卡车上的最大单元数 1310
- 3075. 幸福值最大化的选择方案 1326
- 2554. 从一个范围内选择最多整数 I 1333
- 2126. 摧毁小行星 1335
- 2587. 重排数组以得到最大前缀分数 1337
- 976. 三角形的最大周长 1341
- 1561. 你可以获得的最大硬币数目 1406
- 3627. 中位数之和的最大值 同 1561 题
- 3462. 提取至多 K 个元素的最大总和 1416
- 2099. 找到和最大的长度为 K 的子序列 1447
- 3301. 高度互不相同的最大塔高和 1448
- 945. 使数组唯一的最小增量 1448
- 1846. 减小和重新排列数组后的最大元素 1454
- 3727. 最大交替平方和 1455
- 1647. 字符频次唯一的最小删除次数 1510
- 2971. 找到最大周长的多边形 1521
- 2178. 拆分成最多数目的正偶数之和 1538
- 954. 二倍数对数组 1548
- 1578. 使绳子变成彩色的最短时间 1574
- 2567. 修改两个元素的最小分数 1609
- 1509. 三次操作后最大值与最小值的最小差 1653
- 2611. 老鼠和奶酪 1663
- 3397. 执行操作后不同元素的最大数量 1687
- 3457. 吃披萨 1704 最大改成最小呢?
- 3767. 选择 K 个任务的最大总分数 1704
- LCP 40. 心算挑战 和下面这题一起做
- 1262. 可被三整除的最大和 1762
- 948. 令牌放置 1762
- 1775. 通过最少操作次数使数组的和相等 1850
- 2333. 最小差值平方和 2011 批量减少
- 3645. 最优激活顺序得到的最大总和 2019
- 3947. 购买最多物品数目 II 2215
- 2141. 同时运行 N 台电脑的最长时间 2265
- 1196. 最多可以买到的苹果数量(会员题)
- 2214. 通关游戏所需的最低生命值(会员题)
- 3763. 带阈值约束的最大总和(会员题)
- 3730. 跳跃燃烧的最大卡路里(会员题)
- 3476. 最大化任务分配的利润(会员题)
- 2098. 长度为 K 的最大偶数和子序列(会员题)同 LCP 40
- 2548. 填满背包的最大价格(会员题)
- 3119. 最大数量的可修复坑洼(会员题)
- 2557. 从一个范围内选择最多整数 II(会员题)
- LCS 02. 完成一半题目
思维扩展:
- 1984. 学生分数的最小差值 1306
- 624. 数组列表中的最大距离
- 910. 最小差值 II 2135
- 2835. 使子序列的和等于目标的最少操作次数 2207
- 3366. 最小数组和 贪心做法估计 2900
§1.2 单序列配对
同上,从最小/最大的元素开始贪心。
- 561. 数组拆分 约 1300
- 1877. 数组中最大数对和的最小值 1301
- 881. 救生艇 1530 经典题
- 2592. 最大化数组的伟大值 1569 田忌赛马
- 2576. 求出最多标记下标 1843
§1.3 双序列配对
同上,从最小/最大的元素开始贪心。
- 2037. 使每位学生都有座位的最少移动次数 1357
- 455. 分发饼干 1381
- 2410. 运动员和训练师的最大匹配数 1381 同 455 题
- 1433. 检查一个字符串是否可以打破另一个字符串 1436
- 870. 优势洗牌 1648 田忌赛马
- 826. 安排工作以达到最大收益 1709
- 2449. 使数组相似的最少操作次数 2076
- 1889. 装包裹的最小浪费空间 2214
- 2561. 重排水果 2222
- 2071. 你可以安排的最多任务数目 2648
- 2323. 完成所有工作的最短时间 II(会员题)
§1.4 从最左/最右开始贪心
对于无法排序的题目,尝试从左到右/从右到左贪心。思考第一个数/最后一个数的贪心策略,把 个数的原问题转换成 个数(或更少)的子问题。
读者可以对比下面的题目和 动态规划题单 中的线性 DP、状态机 DP 的区别,思考什么情况下只能 DP 不能贪心,从而加深对「局部最优」和「全局最优」的理解。
- 3402. 使每一列严格递增的最少操作次数 1246
- 3191. 使二进制数组全部等于 1 的最少操作次数 I 1312
- 1827. 最少操作使数组递增 1315
- 2027. 转换字符串的最少操作次数 1346
- 605. 种花问题 约 1400
- 3111. 覆盖所有点的最少矩形数目 1401
- 2957. 消除相邻近似相等字符 1430
- 3192. 使二进制数组全部等于 1 的最少操作次数 II 1433
- 1529. 最少的后缀翻转次数 同 3192 题
- 2789. 合并后数组中的最大元素 1485
- 3576. 数组元素相等转换 1489
- 3849. 重新排列后的最大按位异或值 1556
- 1144. 递减元素使数组呈锯齿状 1559
- 3228. 将 1 移动到末尾的最大操作次数 1593
- 2086. 喂食仓鼠的最小食物桶数 1623
- 2571. 将整数减少到零需要的最少操作数 1649
- 3776. 使循环数组余额非负的最少移动次数 1740
- 861. 翻转矩阵后的得分 1818
- 3980. 变换二进制字符串的最少操作次数 1846
- 3326. 使数组非递减的最少除法操作次数 1864
- 955. 删列造序 II 1876
- 1536. 排布二进制网格的最少交换次数 1881
- 2673. 使二叉树所有路径值相等的最小代价 1917
- 1488. 避免洪水泛滥 1974
- 2366. 将数组排序的最少替换次数 2060
- 2528. 最大化城市的最小电量 2236
- 3449. 最大化游戏分数的最小值 2748
- 2422. 使用合并操作将数组转换为回文序列(会员题)
另见本题单的「§3.1 字典序最小/最大」。
§1.5 划分型贪心
把数组/字符串划分成满足要求的若干段,最小化/最大化划分的段数。
思考方法同上,尝试从左到右/从右到左贪心。
读者可以对比下面的题目和 动态规划题单 中的划分型 DP 的区别,思考什么情况下只能 DP 不能贪心,从而加深对「局部最优」和「全局最优」的理解。
- 1221. 分割平衡字符串 1220
- 2405. 子字符串的最优划分 1355
- 2294. 划分数组使最大差为 K 1416
- 2358. 分组的最大数量 1503
- 2522. 将字符串分割成值不超过 K 的子字符串 1605
- 3557. 不相交子字符串的最大数量 1720
- 1546. 和为目标值且不重叠的非空子数组的最大数目 1855
- 2436. 使子数组最大公约数大于一的最小分割数(会员题)
- 2892. 将相邻元素相乘后得到最小化数组(会员题)
§1.6 先枚举,再贪心
枚举题目的其中一个变量,将其视作已知条件,然后在此基础上贪心。
也可以枚举答案,检查是否可以满足要求。(类似二分答案)
- 2171. 拿出最少数目的魔法豆 1748
- 3085. 成为 K 特殊字符串需要删除的最少字符数 1765
- 1727. 重新排列后的最大子矩阵 1927 可以优化到 时间
- 2749. 得到整数零需要执行的最少操作数 2132
- 2910. 合法分组的最少组数 2132
- 2234. 花园的最大总美丽值 2562
§1.7 交换论证法
交换论证法(exchange argument)常用于证明一类贪心算法的正确性,也可以用来启发思考。做法如下:
- 对于题目,猜想按照「某种顺序」处理数据,可以得到最优解。
- 交换顺序中的两个元素 和 ,计算交换后的答案。
- 对比交换前后的答案。如果交换后,答案没有变得更优,则说明猜想成立。
也可以不用猜想,而是计算「先 后 」和「先 后 」对应的答案,通过比较两个答案谁更优,来确定按照何种顺序处理数据。
- 1877. 数组中最大数对和的最小值 1301
- 2895. 最小处理时间 1352
- 1846. 减小和重新排列数组后的最大元素 1454
- 3457. 吃披萨 1704
- 1665. 完成所有任务的最少初始能量 1901
- 3273. 对 Bob 造成的最少伤害 2013
- 2136. 全部开花的最早一天 2033
- 2561. 重排水果 2222
思维扩展:
- 179. 最大数
- 3309. 连接二进制表示可形成的最大数值 非暴力做法
- 3897. 连接二进制片段得到的最大值 1998
相似题目:
- 2412. 完成所有交易的初始最少钱数 2092
§1.8 相邻不同
以下问题,设 是数组 的长度, 是出现次数最多的元素的出现次数。
问题一:给定数组 ,能否重新排列其中的元素,使得所有相邻元素均不同?如果能,输出重排后的数组。
答:如果 ,则可以做到,否则无法做到。
问题二:给定数组 ,每次操作,删除 中的两个不同元素。最多能操作多少次?
答:最多操作 次。
问题三:给定数组 ,每次操作,删除 中的至多两个不同元素。删除所有元素,最少要操作多少次?
答:最少操作 次。
- 2335. 装满杯子需要的最短总时长 1360
- 3659. 数组元素分组 1440
- 1753. 移除石子的最大得分 1488 同 2335 题,但数据范围更大
- 767. 重构字符串 1681
- 1054. 距离相等的条形码 1702 同 767 题
- 2856. 删除数对后的最小数组长度 1750 有 做法
- 1953. 你可以工作的最大周数 1804
- 3785. 避免禁用值的最小交换次数 2052
- 3664. 两个字母卡牌游戏 2158
- 3495. 使数组元素都变为零的最少操作次数 2206 有 公式
- 3139. 使数组中所有元素相等的最小开销 2666
- 621. 任务调度器 相同元素至少间隔 n
- 358. K 距离间隔重排字符串(会员题)
思维扩展:
§1.9 反悔贪心
一般要用到堆。
- LCP 30. 魔塔游戏 约 1900
- 1642. 可以到达的最远建筑 1962
- 630. 课程表 III 约 2000
- 871. 最低加油次数 2074
- 3362. 零数组变换 III 2424 虽然没有反悔的过程,但思路和 871 是类似的
- 2813. 子序列最大优雅度 2582 也可以不用堆
- 3049. 标记所有下标的最早秒数 II 3111
- 3711. 不出现负余额的最大交易额(会员题)
- 2599. 使前缀和数组非负(会员题)
二、区间贪心
区间贪心有如下经典问题:
- 不相交区间(单机器调度/活动安排):给定一些区间,从中选出尽量多的两两互不相交的区间。
- 区间分组(任务调度/会议室):给定一些区间,把这些区间分成最少的组,使得每组内的区间互不相交。
- 区间选点(射气球,Interval Stabbing):给定一些区间,在数轴上放置最少的点,使得每个区间都包含至少一个点。最少要放置多少个点?
- 区间覆盖(灌溉花园):给定一些区间,从中选出尽量少的区间,覆盖一条指定线段 。
一般来说,区间合并问题(2.5 节)是按左端点排序,其余大多数区间贪心是按右端点排序。请读者在做题后,仔细体会为什么要这样排序。
§2.1 不相交区间
- 435. 无重叠区间 约 1700
- 646. 最长数对链 同 435 题
- 1520. 最多的不重叠子字符串 2363
- 3458. 选择 K 个互不重叠的特殊子字符串 同 1520 题
变形:每个区间有各自的分数,从中选一些两两互不相交的区间,最大化得分之和。详见 动态规划题单 的「§7.2 不相交区间」。
§2.2 区间分组
- 2406. 将区间分为最少组数 1713
- 253. 会议室 II(会员题)
§2.3 区间选点
本质上和不相交区间是一样的。
- 452. 用最少数量的箭引爆气球 约 1700
- 757. 设置交集大小至少为2 2379
- 2589. 完成所有任务的最少时间 2381
- LCP 32. 批量处理任务
§2.4 区间覆盖
- 45. 跳跃游戏 II 约 1700
- 1024. 视频拼接 1746
- 1326. 灌溉花园的最少水龙头数目 1885
§2.5 合并区间
可能算不上贪心,但为了题单的完整性,也放到这个分类中。
- 56. 合并区间
- 57. 插入区间
- 2848. 与车相交的点 非暴力做法
- 55. 跳跃游戏
- 763. 划分字母区间 1443
- 3169. 无需开会的工作日 1483
- 3951. 维持亮度的最小总能量 1530
- 3975. 筛选忙碌区间 1533
- 3964. 照亮道路的最少灯泡数 1572
- 2580. 统计将重叠区间合并成组的方案数 1632
- 3394. 判断网格图能否被切割成块 1916
- 2963. 统计好分割方案的数目 1985
- 2584. 分割数组使乘积互质 2159
- 616. 给字符串添加加粗标签(会员题)
- 758. 字符串中的加粗单词(会员题)
- 3323. 通过插入区间最小化连通组(会员题)
- 759. 员工空闲时间(会员题)
- 2655. 寻找最大长度的未覆盖区间(会员题)
§2.6 其他区间贪心
- 1288. 删除被覆盖区间 非暴力做法
- 2054. 两个最好的不重叠活动 1883
- 1705. 吃苹果的最大数目 1930
- 1353. 最多可以参加的会议数目 2016
三、字符串贪心
§3.1 字典序最小/最大
字典序的定义如下:
- 对于两个字符串 和 ,从左到右依次比较字符 和 的 ASCII 值的大小。
- 时,如果 ,那么 的字典序更小,否则 的字典序更小。
- 如果没有出现 ,则短的字符串字典序更小。
- 如果两个字符串的长度和内容均相同,那么两个字符串的字典序一样。
字典序的定义也可以推广到数组上,按照上述方法比较两个数组的字典序。
- 1323. 6 和 9 组成的最大数字 1194
- 4000. 给定数位和的最大整数 1200
- 3216. 交换后字典序最小的字符串 1243
- 2697. 字典序最小回文串 1304
- 3517. 最小回文排列 I 1357
- 1881. 插入后的最大值 1381
- 2734. 执行子串操作后的字典序最小字符串 1405
- 1432. 改变一个整数能得到的最大差值 1427
- 1946. 子字符串突变后可能得到的最大整数 1445
- 1663. 具有给定数值的最小字符串 1461
- 1328. 破坏回文串 1474
- 2259. 移除指定数字得到的最大结果 非暴力做法
- 2566. 替换一个数字后的最大差值 非暴力做法
- 670. 最大交换 非暴力做法
- 3106. 满足距离约束且字典序最小的字符串 1515
- 3723. 数位平方和的最大值 1537
- 1053. 交换一次的先前排列 1633
- 2375. 根据模式串构造最小数字 1642
- 2182. 构造限制重复的字符串 1680
- 738. 单调递增的数字 约 1700
- 3403. 从盒子中找出字典序最大的字符串 I 1762
- 3170. 删除星号以后字典序最小的字符串 1772
- 1363. 形成三的最大倍数 1823
- 3752. 字典序最小和为目标值且绝对值是排列的数组 1827
- 1754. 构造字典序最大的合并字符串 1829
- 1202. 交换字符串中的元素 1855
- 2434. 使用机器人打印字典序最小的字符串 1953
- 2948. 交换得到字典序最小的数组 2047
- 1505. 最多 K 次交换相邻数位后得到的最小整数 2337
- 3474. 字典序最小的生成字符串 2605 结论好猜,如何证明?
- 555. 分割连接字符串(会员题)
- 3088. 使字符串反回文(会员题)
倒序贪心:
- 3720. 大于目标字符串的最小字典序排列 1958
- 3734. 大于目标字符串的最小字典序回文排列 2330
- 2663. 字典序最小的美丽字符串 2416
- 2048. 下一个更大的数值平衡数 非暴力做法
- 3646. 下一个特殊回文数 非暴力做法
- 3348. 最小可整除数位乘积 II 3101
另见 单调栈题单 的「四、最小字典序」。
§3.2 回文串贪心
部分题目也出现在其他贪心分类中,为了题单的完整性整理到一起。
- 409. 最长回文串 约 1250
- 2697. 字典序最小回文串 1304
- 3517. 最小回文排列 I 1357
- 680. 验证回文串 II 约 1400 进阶问题:有多少个合法方案?
- 1328. 破坏回文串 1474
- 1400. 构造 K 个回文字符串 1530
- 2131. 连接两字母单词得到的最长回文串 1557
- 2384. 最大回文数字 1636
- 3035. 回文字符串的最大数量 1857
- 1616. 分割两个字符串得到回文串 1868
- 1147. 段式回文 1912
- 2193. 得到回文串的最少操作次数 2091
- 3734. 大于目标字符串的最小字典序回文排列 2330
- 3646. 下一个特殊回文数 非暴力做法
- 266. 回文排列(会员题)
- 2422. 使用合并操作将数组转换为回文序列(会员题)
- 1842. 下个由相同数字构成的回文串(会员题)
- 3088. 使字符串反回文(会员题)
另见 数学题单 的「§7.1 回文数」。
§3.3 合法括号字符串
见 数据结构题单 中的「§3.4 合法括号字符串」。
四、数学贪心
§4.1 基础
- 2160. 拆分数位后四位数字的最小和 1314
- 2578. 最小和分割 1351
- 2244. 完成所有任务需要的最少轮数 1372
- 2870. 使数组为空的最少操作次数 1392
- 1217. 玩筹码 1408
- 3091. 执行操作使数据元素之和大于等于 K 1522
- LCS 01. 下载插件
- 397. 整数替换
§4.2 乘积贪心
§4.3 排序不等式
给定两个长度均为 的数组 和 ,可以交换同一数组内的元素,最小化/最大化
把 和 都从小到大排序,可以最大化上式。
把 从小到大排序, 从大到小排序,可以最小化上式。
- 4014. 应用折扣后的最低总价 1192
- 3974. K 个元素的最大总和 1263
- 2285. 道路的最大总重要性 1496
- 3016. 输入单词需要的最少按键次数 II 1534
- 1402. 做菜顺序 1679
- 2931. 购买物品的最大开销 1822
- 1589. 所有排列中的最大和 1871
- 1874. 两个数组的最小乘积和(会员题)
- 2268. 最少按键次数(会员题)同 3016 题
思维扩展:
- 2561. 重排水果 2222 基于 的排序不等式
- 3547. 图中边值的最大和 链/环
§4.4 均值不等式
栅栏问题:长为 米的篱笆栅栏,围成一个矩形,矩形面积最大是多少?
变形:长为 米的栅栏分成 份,每份围成一个正方形,面积之和最小是多少?
- 3081. 替换字符串中的问号使分数最小 1905
- 1969. 数组元素的最小非零乘积 1967
- 2939. 最大异或乘积 2128
- 3723. 数位平方和的最大值 1537
- 2897. 对数组执行操作使平方和最大 2301
§4.5 中位数贪心
给定数组 ,每次操作可以把其中一个数加一或者减一。把 的所有数都变成一样的,最少要操作多少次?
把所有数都变成 的中位数是最优的。
- 462. 最小操作次数使数组元素相等 II
- 2033. 获取单值网格的最小操作数 1672
- 2448. 使数组相等的最小开销 2005 带权中位数
- 2607. 使子数组元素和相等 2071
- 2967. 使数组成为等数数组的最小代价 2116
- 1478. 安排邮筒 2190
- 2968. 执行操作使频率分数最大 2444
- 1703. 得到连续 K 个 1 的最少相邻交换次数 2467
- 3762. 使数组元素相等的最小操作次数 2497
- 3086. 拾起 K 个 1 需要的最少行动次数 2673
- LCP 24. 数字游戏
- 3441. 变成好标题的最少代价 进阶做法
- 棋盘整理 二维
- 296. 最佳的碰头地点(会员题)二维
思维扩展:环形问题
§4.6 归纳法
- 2952. 需要添加的硬币的最小数量 1784
- 330. 按要求补齐数组 同 2952 题
- 1798. 你能构造出连续值的最大数目 1931
§4.7 其他数学贪心
- 1414. 和为 K 的最少斐波那契数字数目 1466 难点在证明上
- 3107. 使数组中位数等于 K 的最少操作数 1605
- 754. 到达终点数字 约 2000
- 1058. 最小化舍入误差以满足目标(会员题)
五、思维题
回想一下高考数学的最后一题,三个小问,前两小问让你计算一些特殊情况,第三小问让你计算/证明一个一般的结论。这其实就是从特殊到一般的思考方式,我们在做算法题(尤其是思维题和构造题)时,也可以从最简单、最特殊的情况开始,去探索题目的性质,逐渐过渡到一般情况。
思考清单
- 小型数组: 只有 个数?只有 个数?只有 个数?
- 万里挑一: 所有数都相同?只有一个数不一样?有两个数不一样?某个数特别大?
- 黑白世界:只有两种数?例如 或者 。
- 反向思考:如果答案是 ,输入会是什么样的?如果答案是 ?是 ?是 ?
- 枚举归纳:试试小范围打表,暴力枚举所有情况,找规律。
思考这些特殊情况,有时会产生求解原问题的灵感。
§5.1 从特殊到一般
- 2745. 构造最长的新字符串 1607 想一想 怎么做, 怎么做, 怎么做
- 2611. 老鼠和奶酪 1663 想一想 怎么做, 怎么做
- 1029. 两地调度 同 2611 题
- 2645. 构造有效字符串的最少插入数 考虑 长为 的所有情况,以及答案等于 的情况
- 2202. K 次操作后最大化顶端元素 1717
- 2568. 最小无法得到的或值 1754
- 1702. 修改后的最大二进制字符串 1825
- 3012. 通过操作使数组长度最小 1833
- 2350. 不可能得到的最短骰子序列 1961
- 3660. 跳跃游戏 IX 2187
- 517. 超级洗衣机
- 2499. 让数组不相等的最小总代价 2633
- 3357. 最小化相邻元素的最大差值 3077
- 3431. 对数字排序的最小解锁下标(会员题)
§5.2 脑筋急转弯
从一般到特殊。
- 2733. 既不是最小值也不是最大值 1148
- 3432. 统计元素和差值为偶数的分区方案 1200
- 3875. 构造奇偶一致的数组 I 1200
- 1903. 字符串中的最大奇数 1249
- 3996. 偶数次骑士移动 1260
- 2549. 统计桌面上的不同数字 1266
- 3746. 等量移除后的字符串最小长度 1327
- 2396. 严格回文的数字 1329
- 1689. 十-二进制数的最少数目 1355
- 3760. 不同首字母的子字符串数目 1364
- 3674. 数组元素相等的最小操作次数 1369
- 3689. 最大子数组总值 I 1371
- 2078. 两栋颜色不同且距离最远的房子 非暴力做法
- 598. 区间加法 II 约 1400
- 521. 最长特殊序列 Ⅰ 约 1400
- 3675. 转换字符串的最小操作次数 1414
- 3227. 字符串元音游戏 1452
- 3638. 平衡装运的最大数量 1463
- 3702. 按位异或非零的最长子序列 1489
- 3810. 变成目标数组的最少操作次数 1492
- 2419. 按位与最大的最长子数组 1496
- 3424. 将数组变相同的最小代价 1503
- 1992. 找到所有的农场组 1539
- 1007. 行相等的最少多米诺旋转 1541
- 2811. 判断是否能拆分数组 1543
- 3987. 处理所有元素的成本 1550
- 463. 岛屿的周长
- 2211. 统计道路上的碰撞次数 1581
- 877. 石子游戏 1590
- 3207. 与敌人战斗后的最大分数 1591
- 3828. 删除子数组后的最终元素 1591
- 3471. 找出最大的几近缺失整数 做到
- 2546. 执行逐位运算使字符串相等 1605
- 1503. 所有蚂蚁掉下来前的最后一刻 1619
- 2860. 让所有学生保持开心的分组方法数 1626
- 1332. 删除回文子序列 1629
- 1975. 最大方阵和 1648
- 1145. 二叉树着色游戏 1741
- 2087. 网格图中机器人回家的最小代价 1744
- 1297. 子串的最大出现次数 1748
- 3577. 统计计算机解锁顺序排列数 1750
- 3282. 到达数组末尾的最大得分 1772
- 3644. 排序排列 1775
- 2712. 使所有字符相等的最小成本 1791
- 3148. 矩阵中的最大得分 1820
- 2311. 小于等于 K 的最长二进制子序列 1840
- 2332. 坐上公交的最晚时间 1841
- 3961. 设备评分的最大和 1880
- 2680. 最大或值 1912
- 2731. 移动机器人 1923 联系 1503 题
- 2556. 二进制矩阵中翻转最多一次使路径不连通 2369
- 3353. 最小总操作数(会员题)
- 1708. 长度为 K 的最大子数组(会员题)
- 3596. 最小花费路径交替方向 I(会员题)
- 3496. 最大化配对删除后的得分(会员题)
- 3125. 使得按位与结果为 0 的最大数字(会员题)
- 1794. 统计距离最小的子串对个数(会员题)
§5.3 等价转化
- 453. 最小操作次数使数组元素相等
- 3375. 使数组的值全部为 K 的最少操作次数 1383
- 2840. 判断通过操作能否让字符串相等 II 1486
- 2914. 使二进制字符串变美丽的最少修改次数 1480
- 3365. 重排子字符串以形成目标字符串 1514
- 1657. 确定两个字符串是否接近 1530
- 3868. 通过交换使数组相等的最小花费 1579
- 3857. 拆分到 1 的最小总代价 做到
- 2551. 将珠子放入背包中 2042
- 391. 完美矩形
- 1585. 检查字符串是否可以通过排序子字符串得到另一个字符串 2333
- 1040. 移动石子直到连续 II 2456
- 1622. 奇妙序列 2476
- 249. 移位字符串分组(会员题)
- 49. 字母异位词分组
- 1183. 矩阵中 1 的最大数量(会员题)
§5.4 逆向思维
- 2139. 得到目标值的最少行动次数 1417
- 3779. 得到互不相同元素的最少操作次数 1444
- 3396. 使数组元素互不相同所需的最少操作次数 同 3779 题
- 3147. 从魔法师身上吸取的最大能量 1460
- 869. 重新排序得到 2 的幂 1505
- 1558. 得到目标数组的最少函数调用次数 1637
- 554. 砖墙 约 1700
- 780. 到达终点 1897
- 417. 太平洋大西洋水流问题 约 1900
- 991. 坏了的计算器 1909
- 2227. 加密解密字符串 1945
- 1354. 多次求和构造目标数组 2015
- 2543. 判断一个点是否可以到达 2221
- 3307. 找出第 K 个字符 II 2232
- 3614. 用特殊操作处理字符串 II 前一题的加强版
- 3419. 图的最大边权的最小值 2243
- 1611. 使整数变为 0 的最少操作次数 2345
- 3609. 到达目标点的最小移动次数 2419
- 936. 戳印序列 2583
- 782. 变为棋盘
- 683. K 个关闭的灯泡(会员题)做到
- 3141. 最大汉明距离(会员题)
时光倒流:
- 3607. 电网维护 1700
- 2718. 查询后矩阵的和 1769
- 3639. 变为活跃状态的最小时间 1853
- 1970. 你能穿过矩阵的最后一天 2124
- 2382. 删除操作后的最大子段和 2136
- 803. 打砖块 2765
§5.5 贡献法
- 3871. 统计范围内的逗号 II 1381
- 2063. 所有子字符串中的元音 1663
- 979. 在二叉树中分配硬币 1709
- 1588. 所有奇数长度子数组的和 做到
- 3771. 探索地牢的得分 1981
- 2477. 到达首都的最少油耗 2012
- 2681. 英雄的力量 2060
- 3855. 给定范围内 K 位数字之和 2085
- 3786. 树组的交互代价总和 2139
- 891. 子序列宽度之和 2183
- 3428. 最多 K 个元素的子序列的最值之和 这题是 891 题的进阶版本
- 3426. 所有安放棋子方案的曼哈顿距离 2443
- 2763. 所有子数组中不平衡数字之和 做法大约 2700
另见单调栈题单的「三、贡献法」。
另见动态规划题单的「§10.2 统计合法元素的价值总和」,这些题有数学做法。
§5.6 两次扫描
从左到右扫一次,再从右到左扫一次。
- 135. 分发糖果
- 3796. 找到带限制序列的最大值 1833
- 3494. 酿造药水需要的最少总时间 2042
- 1840. 最高建筑高度 2374
§5.7 交换元素
- 1202. 交换字符串中的元素 1855
- 1722. 执行交换操作后的最小汉明距离 1892
- 3695. 交换元素后的最大交替和 1984
- 2948. 交换得到字典序最小的数组 2047
§5.8 分类讨论
- 2525. 根据规则将箱子分类 1301
- 860. 柠檬水找零
- 2165. 重排数字的最小值 1362
- 2091. 从数组中移除最大值和最小值 1384
- 1033. 移动石子直到连续 1421
- 3876. 构造奇偶一致的数组 II 1444
- 2918. 数组的最小相等和 1526
- 2591. 将钱分给最多的儿童 1531
- 2131. 连接两字母单词得到的最长回文串 1557
- 3789. 采购的最小花费 1580
- 2844. 生成特殊数字的最少操作 1588
- 1247. 交换字符使得字符串相同 1597
- 838. 推多米诺 1638
- 2170. 使数组变成交替数组的最少操作数 1663
- 2202. K 次操作后最大化顶端元素 1717
- 3922. 使二进制字符串连贯的最少翻转次数 1759
- 2982. 找出出现至少三次的最长特殊子字符串 II 1773
- 3724. 转换数组的最少操作次数 1790 变形题见我的题解
- 3001. 捕获黑皇后需要的最少移动次数 1797
- 2423. 删除字符使频率相同 非暴力做法
- 2934. 最大化数组末位元素的最少操作次数 1803
- 3800. 使二进制字符串相等的最小成本 1841
- 2162. 设置时间的最少代价 1852
- 3942. 排序排列的最少操作数 1855
- 3863. 将一个字符串排序的最小操作次数 1860
- 3440. 重新安排会议得到最多空余时间 II 1998
- 3886. 可排序整数求和 1999
- 1927. 求和游戏 2005
- 2508. 添加边使所有节点度数都为偶数 2060
- 3240. 最少翻转次数使二进制矩阵回文 II 2080
- 3854. 使数组奇偶交替的最少操作 2095
- 3548. 等和矩阵分割 II 2245
- 2029. 石子游戏 IX 2277
- 2468. 根据限制分割消息 2382
- 420. 强密码检验器
- 3609. 到达目标点的最小移动次数 2419
- 1040. 移动石子直到连续 II 2456
- 335. 路径交叉
- 1330. 翻转子数组得到最大的数组值 2482
- 3197. 包含所有 1 的最小矩形面积 II 2541
- 3366. 最小数组和 做到
- 2499. 让数组不相等的最小总代价 2633
- 3311. 构造符合图结构的二维矩阵 2664
- 3139. 使数组中所有元素相等的最小开销 2666
- 3017. 按距离统计房屋对数目 II 2709
- 2983. 回文串重新排列查询 2780
- 3395. 唯一中间众数子序列 I 2800
- 3357. 最小化相邻元素的最大差值 3077
- 1900. 最佳运动员的比拼回合 做到 或者
- LCP 48. 无限棋局
- LCP 21. 追逐游戏
六、构造题
构造题会给定一些约束,我们要构造一个满足这些约束的数组/字符串等。
思考方式和第五章的「思考清单」是一样的,在特殊情况中寻找灵感。
- 1304. 和为零的 N 个不同整数 1167
- 3963. 构造恰好一条路径的网格 1311
- 942. 增减字符串匹配 1444
- 1968. 构造元素不等于两相邻元素平均值的数组 1499 做法不止一种,见我在官解下的 评论
- 1253. 重构 2 行二进制矩阵 1506
- 1317. 将整数转换为两个无零整数的和 做到 。进阶问题:最小化
- 3513. 不同 XOR 三元组的数目 I 1663
- 2182. 构造限制重复的字符串 1680
- 3592. 硬币面值还原 1701
- 969. 煎饼排序 约 1800
- 406. 根据身高重建队列
- 1605. 给定行和列的和求可行矩阵 1868 西北角法
- 2375. 根据模式串构造最小数字 做到
- 324. 摆动排序 II 约 2000
- 3988. 创建一个恰好有 K 条路径的网格图 I 2055
- 667. 优美的排列 II 约 2100
- 2122. 还原原数组 2159
- 1980. 找出不同的二进制字符串 做到
- 3680. 生成赛程 2378
- 932. 漂亮数组 约 2500
- 2790. 长度递增组的最大数目 2620
- 3311. 构造符合图结构的二维矩阵 2664
- 2573. 找出对应 LCP 矩阵的字符串 2682
- 1982. 从子集的和还原数组 2872
- 280. 摆动排序(会员题)
- 484. 寻找排列(会员题)
- 3990. 创建一个恰好有 K 条路径的网格图 II(会员题)
更多构造题,可以去 Codeforces 搜索 constructive algorithms。
七、交互题
- 278. 第一个错误的版本
- 374. 猜数字大小
- 1237. 找出给定方程的正整数解 非暴力做法
- 1095. 山脉数组中查找目标值 1827
- 843. 猜猜这个单词 2078
- 2728. 计算一个环形街道上的房屋数量(会员题)
- 277. 搜寻名人(会员题)
- 2782. 唯一类别的数量(会员题)
- 3064. 使用按位查询猜测数字 I(会员题)
- 3094. 使用按位查询猜测数字 II(会员题)
- 1428. 至少有一个 1 的最左端列(会员题)
- 702. 搜索长度未知的有序数组(会员题)
- 1533. 找到最大整数的索引(会员题)
- 2936. 包含相等值数字块的数量(会员题)
- 1618. 找出适应屏幕的最大字号(会员题)
- 1538. 找出隐藏数组中出现次数最多的元素(会员题)
- 489. 扫地机器人(会员题)
- 1778. 未知网格中的最短路径(会员题)
- 1810. 隐藏网格下的最小消耗路径(会员题)
- 1274. 矩形内船只的数目(会员题)
八、其他
- 2833. 距离原点最远的点 1294
- 2740. 找出分区值 1302
- 2946. 循环移位后的矩阵相似检查 1406 结论
- 3523. 非递减数组的最大长度 1435 结论好猜,如何证明?
- 781. 森林中的兔子 1453 逻辑推理题
- 1041. 困于环中的机器人 1521 如何证明结论?
- 3587. 最小相邻交换至奇偶交替 1548
- 1864. 构成交替字符串需要的最小交换次数 1601
- 1899. 合并若干三元组以形成目标三元组 1636
- 2498. 青蛙过河 II 1759
- 134. 加油站
- 3443. K 次修改后的最大曼哈顿距离 1856
- 3635. 最早完成陆地和水上游乐设施的时间 II 1870
- 3002. 移除后集合的最多元素数 1917
- 1733. 需要教语言的最少人数 1984
- 659. 分割数组为连续子序列 约 2100
- 2732. 找到矩阵中的好子集 2240 注意数据范围
- 3474. 字典序最小的生成字符串 2605 结论好猜,如何证明?
- LCP 03. 机器人大冒险
- LCP 26. 导航装置
- LCP 70. 沙地治理
- 2340. 生成有效数组的最少交换次数(会员题)
- 3460. 最多删除一次后的最长公共前缀(会员题)证明
- 2753. 计算一个环形街道上的房屋数量 II(会员题)
答疑
问:贪心和 DP 的区别是什么?
答:DP 可以视为带记忆化的暴力搜索,只要不遗漏任何分支,答案一定是对的。贪心可以视为带剪枝的搜索,如果贪心策略不对,就容易贪过头,把正确的分支给剪掉。
问:有没有万能方法,判断一道题是贪心还是 DP?
答:很难。如果不知道题目类型,把 DP 想成贪心的大有人在。我的建议是先思考 DP 能不能做,再思考贪心。如果 DP 的时间复杂度足以通过题目,就不用思考贪心策略了。
此外,这也说明按照题单刷题的缺点:提前知道题目类型,跳过了一些思考步骤。如何弥补这个缺点?请看 如何科学刷题。
关联题单
算法题单
- 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
- 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
- 单调栈(基础/矩形面积/贡献法/最小字典序)
- 网格图(DFS/BFS/综合应用)
- 位运算(基础/性质/拆位/试填/恒等式/思维)
- 图论算法(DFS/BFS/拓扑排序/基环树/最短路/最小生成树/网络流)
- 动态规划(入门/背包/划分/状态机/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
- 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
- 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
- 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
- 链表、树与回溯(前后指针/快慢指针/DFS/BFS/直径/LCA)
- 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)
欢迎关注 B站@灵茶山艾府
如果你发现有题目可以补充进来,欢迎评论反馈。


