【路飞】491. 递增子序列

133 阅读1分钟

题目描述

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

解析

  1. 通过变量start,每次选取一个数字;
  2. 通过深度递归来找出所有可能的路径;
  3. 通过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;
}