回溯算法
1.组合问题
-
基本参数为int[] nums,int start
- nums数组为要组合的数组
- start为单层搜索逻辑起始下标,为了排除重复结果(不添加前面选择过得元素)
-
LeetCode 78 子集
-
LeetCode 39 组合总和
-
LeetCode 77组合
减枝要素: for(int i = start; i<=n-(k-list.size())+1; i++) -
LeetCode 90 子集2(重复元素包含)
核心要点:
1.开始前先排序
2 if(i>start&&nums[i]==nums[i-1]){continue; }
- i>start表示不是循环第一个元素
- nums[i] == nums[i-1] 表示后一个和前一个一样,横向循环跳过这次
- LeetCode 17 电话问题
- 不需要int start来去重
- 使用HashMap来解题会更简单
2.排列问题
-
基本参数 int[] nums
-
LeetCode 46 全排列
-
LeetCode 47 全排列2
要点:if(i>0&&nums[i]==nums[i-1]&&!used[i-1]){continue;}
不是循环第一个元素,跳过横向相同的元素,且要是弹出列表的元素
3.切割问题
- LeetCode 131 分割回文串
要点: String str = s.substring(start,i+1);
//跳过这次递归,直接杀死该节点
if(!isPalindrome(str)){
continue;
}