【路飞】算法与数据结构-递增子序列

129 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

思路

  • 如果 path 里面有数据了就说明找到了一个序列
  • 把使用过的数据放到该数组
  • path 里面存在数据 的情况下:
    1. 如果后面一个比前面一个小, 那么跳过
    1. 如果这个数据用过, 那么 跳过
  • 如果在同一层 中使用过那么就不能再使用了,因为 当前这个数如果使用了, 那么这个数所有的组合其实已经存在的,那么你这个数就属于多余的了, 所以直接跳过
  • 使用后设置为 true
  • 放入 path 中
  • 回溯
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var findSubsequences = function (nums) {
    let res = [];
    let path = [];
    back(0);
    return res;
    function back(startIndex) {
      
        if (path.length > 1) {
            res.push(path.slice());
        }
        let used = [];
        for (let i = startIndex; i < nums.length; i++) {
           
            if ((path.length > 0 && nums[i] < path[path.length - 1]) || used[nums[i] + 100]) {
                continue;
            }
            used[nums[i]+100] = true;
            path.push(nums[i]);
            back(i + 1);
            path.pop()
        }
    }
};