491. 递增子序列

93 阅读1分钟

题目描述

leetcode-cn.com/problems/in…

分析

通过回溯的方法来完成

每次在扩展 path 之后,回退一位

算法

回溯

过程

通过 set 来去重

通过 dfs 来递归地统计子序列

扩展 path,继续 dfs,然后回退

代码

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var findSubsequences = function(nums) {
    const n = nums.length
    const ret = []
    const set = new Set()
    
    const dfs = (start, path) => {
        if (path.length >= 2) {
            const str = path.toString()
            if (!set.has(str)) {
                set.add(str)
                ret.push(path.slice())
            }
        }
        
        for (let i = start; i < n; i++) {
            const cur = nums[i]
            const pre = path[path.length - 1]
            if (!path.length || cur >= pre) {
                path.push(cur)
                dfs(i + 1, path)
                path.pop()
            }
        }
    }
    dfs(0, [])
    
    return ret
};