[路飞][LeetCode]491_递增子序列

162 阅读1分钟

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

解题思路

  • 我们定义res用来存放结果
  • 我们用一个set存储每个合格的path,下次遇到重复的,不让它加入解集
  • start向后遍历数组,选合适的数推入pathpath也作为参数进入递归。
  • 在递归过程中,不断选数字入path
  • start指针到达边界,能选的都选了,没有数字可选了,结束递归。

解题代码

var findSubsequences = function(nums) {
    const res = [];
    const len = nums.length;
    const set = new Set();

    const dfs = (start,path)=>{
        if (path.length >= 2) {
            const str = path.toString()
            if(!set.has(str)){
                res.push(path.slice())
                set.add(str)
            }
        }
        for(let i = start;i<len;i++){
            const pre = path[path.length-1]
            const cur = nums[i]
            if(path.length==0||pre<=cur){
                dfs(i+1,[...path,cur])
            }
        }
    };
    dfs(0, []);
    return res
};

如有任何问题或建议,欢迎留言讨论!