Leetcode回溯法四板一解模板

1 通用回溯法模板

在这里插入图片描述

vector<xxx> solution;
void backtrack(路径, 选择列表){
	if (满足终止条件) {
		添加路径(当前解);
		return;
	}
	for (选择 : 选择列表) {
		if (notValid(选择)) continue;
		做选择;     // 在选择列表中移除<选择>
		backtrack(路径, 选择列表);
		撤销选择;   // 将<选择>恢复到选择列表中
	}
}

2 回溯法常用四板斧+一解(first索引+inPath+sort相邻去重+set非相邻去重)

通过经典题目的训练,目前常用在回溯法求解问题的技巧主要有4种,解题时依据问题性质通过混用其中一至多种可实现机械化解题,针对这四种技巧具体介绍如下

四板一解功能例子
inPath备忘录(i = 0)避免重复相同的选择避免[1,1,1][2,2,2]出现
first索引(i = first)避免重复相同的选择 + 避免顺序不同,但组合相同的解避免[1,2,3][1,3,2]共现
sort相邻去重!(input[i-1]==input[i])输入有重复时,避免重复完全相同的解避免[2,2,3][2,2,3]共现
set非相邻去重!set.count(input[i])输入有重复 + 不能sort时,避免重复完全相同的解同上
bool backtrack(args) {}只返回1个解使用if (backtrack()) return true;——
添加解后无return同一条路径上有多个解[0,1][0,1,2]

【备注】:[1, 2, 3, 2]就可以出现两个路径不同但完全相同的解[2, 3]

上述四板一解在不同题目中的使用情况,具体使用方法直接点击题目链接查看即可

四板斧适用场景题目
inPath备忘录(i = 0)排列46.全排列; 47.全排列 II
first索引(i = first)组合/子集/分割77.组合; 39.组合总和; 216.组合总和III;
78.子集; 131. 分割回文串; 93.复原 IP 地址
sort相邻去重!(input[i-1]==input[i])输入有重复(辅助上述场景)90.子集II; 40.组合总和II; 47.全排列 II
set非相邻去重!set.count(input[i])输入有重复 + 不能排序491. 递增子序列
bool backtrack(args) {}只返回1个解37. 解数独; 332.重新安排行程
添加解后无return同一条路径上有多个解(子集)78.子集; 90.子集II; 494. 目标和
其他方法适用场景题目
回溯模板 + 多条件剪枝棋盘问题等51. N皇后; 37. 解数独; 17. 电话号码的字母组合
回溯模板 + 新数据结构图论等332.重新安排行程(欧拉回路)

附录:本专题刷题列表

在这里插入图片描述

致谢

感谢「代码随想录」公众号梳理的思路,欢迎大家关注这位大佬的公号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_World

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值