回溯算法
什么是回溯算法
- 回溯算法也是一种算法思想
- 回溯算法是一种渐进式寻找并构建问题解决方式的策略
- 回溯算法从一个可能的动作开始,如果不行,就回溯选择另外一个,直到将问题解决。
举例说明,就是前面有3个山洞,先走左边的山洞,发现不通,返回到原点,再尝试其他的山洞。
全排列(leetcode - 46)
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
输入:nums = [0,1]
输出:[[0,1],[1,0]]
思路
- 用递归模拟出所有情况
- 遇到包含重复元素的情况,就回溯
- 收集所有到达终点的元素(新数组的长度等于原数组长度),并返回
var permute = function(nums) {
const res = [];
const rec = (path) => {
if(path.length === nums.length) {
res.push(path);
return;
}
// nums.forEach(n => {
// console.log(n);
// if(path.includes(n)) {
// return;
// }
// rec(path.concat(n))
// })
for(let i = 0; i< nums.length; i++) {
const n = nums[i];
if(path.includes(n)) {
continue;
}
rec(path.concat(n))
}
}
rec([]);
return res;
};
时间复杂度:O(n!)
每次递归循环次数都比上次少1,即n*(n-1)*(n-2)*...*1
所以时间复杂度是n的阶乘。
空间复杂度:O(n)
空间复杂度是递归调用栈的深度n,为O(n)