第三十二题 491. 递增子序列

491. 递增子序列

题目描述

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

思路

回溯算法 主要难在如何去重 和 判断终止条件

  • 去重 选择每个数为搜索起点时 都定义数组用于记录该数值 避免重复
  • 终止条件为:nums.length的长度 因为具有去重操作 就意味着一直搜索到nums.length的长度 (位)数即可终止
  • 注意 递增子序列 每找一个以上的数字 就组成了一个序列 可以 push 进结果数组
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var findSubsequences = function(nums) {
    let result = [];
    let temp = [];
    let len = nums.length;
    
    let backTracking = function(index){
        let tLen = temp.length;
        // temp 长度大于1 就组成一个序列
        if(temp.length > 1){
            result.push(temp.slice());
        }
        // 去重
       let visited = [];
        for(let i = index; i < len; i++ ){
             // 序列不递增 数值重复 退出本次搜索
            if((temp.length > 0 && nums[i] < temp[tLen - 1]) || visited[nums[i]+100] ){
                continue;
            }
            //标记当前值
            visited[nums[i]+100] = true;
            temp.push(nums[i]);
            backTracking(i+1);
            temp.pop();
            
        }
    }
    backTracking(0);
    return result;
    
};

你可能感兴趣的:(算法:回溯算法,算法,javascript,深度优先)