思路
回溯算法基础
- 回溯法是一种通过穷举所有可能情况来找到所有解的算法。在本题中,我们通过回溯法来构建所有可能的子序列。
- 定义一个结果数组 result 用于存储所有符合条件的递增子序列,一个路径数组 path 用于存储当前正在构建的子序列
递归函数参数构建
原始数组nums和其实遍历到索引位置,每一层遍历到起始位置不一样的,所以需要startIndex来记录
递归终止条件
这里主要是两个地方需要注意,一个是递增的序列,那么就需要新加入的值比path中的最后一个值更大,另外一点是同一个层级中,不能出现重复的元素,所以我们使用了set来记录当前层级的元素,如果set中已经有当前元素,那么需要continue,跳过本元素。
终止条件
- 当 path 的长度大于等于 2 时,将 path 的副本添加到 result 中,因为我们要找的是长度至少为 2 的递增子序列。
- 当 startIndex 等于数组 nums 的长度时,说明已经遍历完整个数组,递归结束。
实现
var findSubsequences = function (nums) {
let result = [], path = [];
const backtracking = (nums, startIndex) => {
if (path.length >= 2) {
result.push([...path])
}
if (startIndex === nums.length) return;
const set = new Set();
for (let i = startIndex; i < nums.length; i++) {
if (set.has(nums[i]) || path[path.length - 1] > nums[i]) {
continue
} else {
path.push(nums[i]);
set.add(nums[i])
}
backtracking(nums, i + 1)
path.pop()
}
}
backtracking(nums, 0)
return result;
};