[路飞]_LeetCode_491. 递增子序列

192 阅读1分钟

「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战

题目

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

来源:力扣(LeetCode)leetcode-cn.com/problems/in…

解题思路

通过递归的方式,获取数组中从第 n 位开始能产生的递增序列。

代码实现

var findSubsequences = function(nums) {
    const ret = []
    //从0开始,当前已经选择0个元素
    getResult(nums, 0, [], ret)
    return ret
};

var getResult = function(nums, k, buff, ret) {
    //特殊处理,只有1个元素时不算序列
    if (buff.length > 1) ret.push([... buff])

    const len = nums.length
    const map = new Map()
    //在buff中添加一个临时元素
    buff.push(0)
    
    for (let i = k; i < len; i++) {
        //去重
        if (map.has(nums[i])) continue
        
        //如果buff里面只有一个元素,或者nuns[i]大于等于buff的倒数第二个元素时
        //把nuns[i]加到buff的最后
        if (buff.length === 1 || nums[i] >= buff[buff.length - 2]) {
            buff[buff.length - 1] = nums[i]
            
            //去重
            map.set(nums[i], 1)
            
            //递归处理,第i+1个位置,当前已经选择的元素存在buff中
            getResult(nums, i + 1, [...buff], ret)
        }
    }
}

如有错误欢迎指出,欢迎一起讨论!