代码随想录:回溯总结

本文探讨了组合问题的几种变体,如固定数量组合、无重复数字的组合总和、重复元素的组合处理,以及切割问题、子集问题(包括递增子序列)和排列中的去重策略。着重于算法设计和终止条件的设定。
摘要由CSDN通过智能技术生成

一、组合问题

1. N个数中取k个

终止条件:path中元素个数等于k个

要设startindex

2. 组合总和

(1) 第一种

题目特征:限制了每个组合中数的个数,每种组合中不存在重复的数字,即每个数只能用一次

终止条件:path中元素之和大于targetsum时直接返回,元素个数达到要求时,且path中元素之和等于targetsum时终止

要设startindex

(2) 第二种

题目特征:每个组合中数的个数不确定,集合中的元素可以重复取用

终止条件:path中元素之和大于targetsum时直接返回,path中元素之和等于targetsum时终止

要设startindex,但是递归时要依然从i开始(因为元素可以重复取用)

(3) 第三种

题目特征:集合中元素不能重复使用,但集合中可能含有重复元素,最终的结果中不能包含重复的组合。

终止条件:path中元素之和大于targetsum时直接返回,元素个数达到要求时,且path中元素之和等于targetsum时终止

要设startindex

要用used去重(树层上的去重),去重记得排序

3. 多个集合求组合

题目特征:给定的是多个独立的集合,每次从不同的集合中分别取一个数

终止条件:遍历完集合序号

不要设startindex,递归起点都是0开始

二、切割问题

比较难

终止条件:切割线切到了字符串最后

要设startindex

startindex就是切割线

[startIndex, i] 就是要截取的子串

三、子集问题

子集问题中,每个节点都要收集!

1. 集合不含重复元素

要设startindex

终止条件:startIndex已经大于数组的长度了(可以不写)

2. 集合中可能含重复元素

1的基础上加上去重

3. 递增子序列

(给定数组中可能包含重复数字)

终止条件同上

不能用used去重,因为要求递增子序列,就不能排序了,只能用set或nums来记录树层中哪个用过哪个没用过

遇到非递增了或者元素用过了就跳过

四、排列

1. 没有重复数字的序列

终止条件:path的大小和nums数组一样大的时候

不设startindex

要用used来记录取过的元素(先取一个,然后没被取到的当中再取一个...)

2. 有重复数字的序列

1加上去重

先写这么多,棋盘问题还没看呢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值