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;
};