递增子序列

4/8/2022 回溯子集

# 题目 LeetCode (opens new window)

给你一个整数数组 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]]

# 代码

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var findSubsequences = function (nums) {
  let res = [];
  let path = [];
  let len = nums.length;
  function backtrack(nums, startIndex) {
    if (startIndex >= len) return;
    let set = new Set();
    for (let i = startIndex; i < len; i++) {
      // 剪枝优化
      if (i > 0 &&  set.has(nums[i])) continue;
      // 做选择
      if (path.length >= 1) {
        if (nums[i] < path[path.length - 1]) continue;
        path.push(nums[i]);
        res.push([...path]);
        set.add(nums[i])
      } else {// 选择第一层元素
        path.push(nums[i])
        set.add(nums[i])
      }
      // 递归
      backtrack(nums, i + 1)
      // 撤销选择
      path.pop();
    }
  }
  backtrack(nums, 0);
  return res;
};
Last Updated: 4/11/2022, 3:53:39 PM