排列问题
- 排列问题的特点:
(1)每种排列的长度是固定的
(2)排列内部允许出现重复元素,排列之间是不允许重复- 排列问题中
abc
和bca
是不同的排列
组合问题
- 组合问题的特点:
(1)每种组合的长度是不固定的
(2)组合内部不允许出现重复元素,组合之间也不允许重复ab
和ba
是同一个组合,这一点和排列是不同的,因此在组合问题的回溯过程中,不需要考虑前面的数字,否则就会出现重复- 组合相关问题(不局限于组合问题)重点看组合内是否能够重复,组间一般是不允许重复的
子集问题
去重问题
- 无论是
排列问题
、组合问题
还是子集问题
其中最重要的就是去重,因为一般给定的数组或字符串中都可能出现有重复的数字,而一般情况下,题目中都要求组内可以出现重复
、组间不能出现重复
- 同一树层的元素在组内占据同样的位置,但属于不同的组;同一树枝的元素在组内占据不同的位置,但属于同一个组
- 去重问题分为
树层去重
和树枝去重
,由于题目中要求组间
不能出现重复,所以要进行树层去重
- 树枝去重:
- 树枝去重主要解决的是指定下标元素已经被使用,不能再次重复使用该下标的元素
- 解决方法:
(1)使用bool
数组,一般用于排列问题
,且不允许修改原数组的情况下使用
(2)改变for
循环起始下标,排列问题
和组合问题
对起始下标的选择方式是不同的
- 树层去重:
- 利用
排序算法
,先对原数组进行排序,若当前元素与前一个元素的值相同则说明已被考虑,无需再次考虑 - 利用
unordered_set
,树层遍历中,考虑过的元素加入该unordered_set
中,防止重复遍历,对于组合问题首先还需要进行排序,否则还是会可能会出现重复,对于排序问题,不需要进行预先排序