给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var findSubsequences = function (nums) {
let result = [];
let path = []
// 注意一定不要排序,因为求的是当前数组的增序列
const traverse = (startIndex) => {
if (path.length >= 2) {
result.push([...path])
// 不加return 是为了 避免到达某一节点不再继续向下遍历,需要遍历所有节点,就不要提前return 了
}
// 确保每一层的元素,不能有重复选择
let used = {};
for (let i = startIndex; i < nums.length; i++) {
// 这里没有理解,为什么不是 nums[i] > nums[i-1]
if (path.length > 0 && (nums[i] < path[path.length - 1]) || used[nums[i]]) { continue };
used[nums[i]] = true
path.push(nums[i]);
traverse(i + 1)
// 不在这里是因为,避免最后一个相同元素漏解
path.pop();
}
}
traverse(0)
return result
};