题目描述
491. 递增子序列
难度 中等
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
输入: nums = [4,6,7,7]
输出: [[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
示例 2:
输入: nums = [4,4,3,2,1]
输出: [[4,4]]
提示:
1 <= nums.length <= 15-100 <= nums[i] <= 100
解析
- 通过变量start,每次选取一个数字;
- 通过深度递归来找出所有可能的路径;
- 通过map来对数组进行去重复。
function findSubsequences(nums) {
const res = [];
const map = new Map();
const dfs = (start, path) => {
if (path.length > 1 && !map.has(path.toString())) {
res.push(path.slice());
map.set(path.toString(), 1);
}
for (let i = start; i < nums.length; i++) {
// 上一次选择的最后一位数字
const prev = path[path.length - 1];
const cur = nums[i];
// 是否满足递增关系
if (start == 0 || prev <= cur) {
path.push(nums[i]);
dfs(i + 1, path);
path.pop();
}
}
};
dfs(0, []);
return res;
}