此处和 40.组合总和II 较为相似,在集合中存在重复的元素,在结果中需要防止重复选取问题,也就是在回溯时,对于当前元素 nums[cur]
需要跳过后面全部与他值相同的元素。(依旧是存在两种处理方式,一个是使用for循环进行跳过,两外则是对重复元素进行统计,在递归时分别处理选取 0-n
个元素的情形。)
LeetCode-199-二叉树的右视图
LeetCode-78-子集
LeetCode-93-复原IP地址
本题实际上就是向一个数字字符串中加入三个 .
使得最终的结果满足IP地址的定义。对于IP地址的要求为 0-255,并且要求不包含前导的0元素。此处的处理方式和 131.分割回文串 类似,也可以生成相应的IP判断二维数组,但是相应的子串是否符合IP地址的定义并不需要使用动态规划法进行判断。
创建是否满足IP的数组将导致空间复杂度的上升,因此此处也可以采取生成相应的子串后再判断的方式。
基本思路:首先,将 s[cur]
处的的子串作为IP地址中的一段,并判断是否符合规范,符合规范,tmp.push_back(s.substr(cur,1))
,开始递归 cur+1
,递归返回后, tmp.pop_back
完成回溯。然后选取 s[cur:cur+1]
处的作为子串,判断是否为IP
LeetCode-131-分割回文串
LeetCode-102-二叉树的层序遍历
二叉树的前中后序遍历
二叉树的前中后序遍历,分别基于递归和迭代实现
LeetCode-40-组合总和II
LeetCode-39-组合总和
相较于 216.组合总和III 本题的重要区别在于:要求从参数序列中进行元素的选取,元素允许重复选取,对选取元素的数量没有要求。
那么依旧是回溯的思想进行,为了实现元素的重复选取,在for循环中选取了当前元素 candidate[cur]
后,进入递归时传递的参数 cur
应当不变,也就保证了在下一层递归中依旧可以选取元素 candidate[cur]
,并且为了防止出现 [2,2,3]
和 [2,3,2]
的情形,每次都从 cur
开始选取。
LeetCode-17-电话号码的字母组合
此处的要求就是穷举,那么对于每一个数字中的每一个字母都需要选取一次,基本思想就是选取当前字母递归,在递归返回后,回溯选取(不选当前字母),进入到下一次递归中。