非递减子序列

52 阅读1分钟

491. 非递减子序列

思路

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