backtrack-回溯搜索算法总结

backtrack——回溯算法总结

这几天着重在刷LeetCode有关回溯搜索算法的题,之前也写了一些博客,感觉当时清楚,但是原理上还是有点模糊。之前根据别人的模板,依葫芦画瓢,解决了一些问题,但是有的时候条件变了,就有点理不清楚了,特别是哪里该加一些限制条件,很懵逼。所以总结了一下。

1. 到底什么是回溯?

回溯算法,都知道是基于递归的算法。那为什么要用递归呢,可以用传统的写法代替嘛?之所以用递归,就是因为如果用传统的方式,很难写或者根本写不出来。举个例子,比如我们想知道用集合nums = [1, 2, 3]中的三个数字(可重复)一共能构成多少个不同的三位数,学过排列组合的都知道一共有27(3的3次方)种:(1,1,1), (1,1,2), (1,1,3), (2,1,1), (2,1,2), (2,1,3)…(3,3,3) 。用最传统的方式,都会写,用一个三层的for循环来写:

vector<vector<int>> res;
vector<int> path;
for (int i = 0; i < 3; i++) {
   
	for (int j = 0; j < 3; j++) {
   
	 	for (int k = 0; k < 3; k++) {
   
	 		path.push_back({
    num
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值