leetcode第46题全排列
想法:
- 其实现在对于我来说,能够熟练的记住代码的框架,并且理解其中的含义,就已经很可以了,其中的细节真的是不太好把控
- 解决一个回溯的问题,实际上就是一个决策树的遍历过程,我们只需要思考三个问题
- 路径: 也就是已经做出的选择
- 选择列表:也就是你当前进行的选择
- 结束条件:也就是到达决策树的底层时,无法再做选择的条件
- 核心的核心就是:for循环的一个递归,这在多叉树的遍历其实是很相似的,在递归之前做选择,然后再递归之后撤销选择
- 这种东西其实无论怎么优化,都符合回溯的代码框架,但是时间复杂度都不可能低于o(N)因为穷举整颗决策树是没有办法避免的,这也就是回溯算法的特点,就是纯暴力穷举,复杂度一般都会很高
class Solution {
List<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> permute(int[] nums) {
//经典回溯算法 全排列
LinkedList<Integer> backGround = new LinkedList<>();
backLook(nums,backGround);
return res;
}
public void backLook(int[] nums, LinkedList<Integer> backGround) {
if (backGround.size() == nums.length) {
res.add(new LinkedList<>(backGround));
return;
}
for (int i = 0; i < nums.length; i++) {
if (backGround.contains(nums[i])) continue;
backGround.add(nums[i]);
backLook(nums,backGround);
backGround.removeLast();
}
}
}