深搜dfs用来干很多的事情,比如查找路径,。,(可以尝试所有路径然后找出其中最想要的那一条),数字全排列,找连续子序列的和最大值或者最小值,找出和为XX的连续子序列。
public class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums == null) {
return null;
}
Arrays.sort(nums);
List<Integer> item = new ArrayList<>();
//i控制每个dfs中的itme的数量,也就是说dfs最好拿一个统一的标准来恒定,这个标准就是待会儿用来判定
//dfs退出的有利条件,可以是子元素个数达到某一值,可以是sum或者其他条件达到某一值
for (int i = 0; i <= nums.length; i++) {
item.clear();
dfs(nums, 0, i, item, result);
}
return result;
}
/**
* 管用的深搜
*
* @param nums 深搜的数组
* @param start 起始数字位置
* @param size 控制的元素大小
* @param item 子项
* @param result 结果总list
*/
public void dfs(int[] nums, int start, int size, List<Integer> item, List<List<Integer>> result) {
//临界条件
if (item.size() == size) {
result.add(new ArrayList<>(item));
return;
}
//尝试每一步
for (int i = start; i < nums.length; i++) {
item.add(nums[i]);
//进行下一步
dfs(nums, i + 1, size, item, result);
//回收
item.remove(item.size() - 1);
}
}
}
延伸
找真子集,找不包含XX的真子集,找和为XX的子集