[路飞]_递增子序列

145 阅读1分钟

491. 递增子序列

题目

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例

输入: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]]

题解

暴力DFS+哈希

时间复杂度O(2n)O(2^n);
枚举数组,从k位置开始,继续寻找[k+1,len]区间,找到大于k位置的时next,next进入递归;
使用哈希表保存之前找到的数据,防止答案重复

这,能敲出代码但是表述不出来啊~~~~

代码

const findSubsequences = (nums) => {
  const len = nums.length
  const set = new Set()
  for (let i = 0; i < len; i++) {
    helper(i, String(nums[i]))
  }
  function helper(i, s) {
    // i是起点,s是字符串
    if (i === len) return
    if (set.has(s)) return
    set.add(s)
    for (let j = i + 1; j < len; j++) {
      if (nums[j] >= nums[i]) helper(j, s + ',' + nums[j])
    }
  }
  const result = []
  set.forEach((s) => {
    const a = s.split(',')

    a.length > 1 && result.push(a.map((v) => Number(v)))
  })
  return result
}