解题思路:
- path 中包含两个以上的元素时再去收集结果。
- 剪枝一方面需要剪掉非递增的数字,另一方面剪掉同一层上面重复的数字。
- 这里去重使用set,由于每次只需要针对树层的数字去重,所以每轮都是新的set,不需要回溯。
var findSubsequences = function (nums) {
const res = [];
const path = [];
const backtracking = (nums, startIndex) => {
if (path.length > 1) {
res.push(Array.from(path));
}
const set = new Set();
for (let i = startIndex; i < nums.length; i++) {
if ((path.length !== 0 && nums[i] < path[path.length - 1]) || set.has(nums[i])) {
continue;
}
set.add(nums[i]);
path.push(nums[i]);
backtracking(nums, i + 1);
path.pop();
}
}
backtracking(nums, 0);
return res;
};
解题思路:
- 用used数组记录已经用过的数字。
- 由于所有数字都有用,所以从0开始循环。
var permute = function (nums) {
const res = [];
const path = [];
const backtracking = (nums, used) => {
if (path.length === nums.length) {
res.push(Array.from(path));
return;
}
for (let i = 0; i < nums.length; i++) {
if (used[i] === true) {
continue;
}
path.push(nums[i]);
used[i] = true;
backtracking(nums, used);
used[i] = false;
path.pop();
}
}
backtracking(nums, []);
return res;
};
解题思路:
- 去重的逻辑和组合类似,用used数组做树层去重
- 由于从0开始for循环,所以需要 used[i] 是true的时候来做树枝的区分。
var permuteUnique = function (nums) {
const res = [];
const path = [];
const backtracking = (nums, used) => {
if (path.length === nums.length) {
res.push(Array.from(path));
return;
}
for (let i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] === nums[i - 1] && used[i - 1] === false) {
continue;
}
if (used[i] === true) {
continue;
}
path.push(nums[i]);
used[i] = true;
backtracking(nums, used);
used[i] = false;
path.pop();
}
}
nums.sort((a, b) => a - b);
backtracking(nums, []);
return res;
};
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。