题目描述
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
示例1
输入: [4, 6, 7, 7]
输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
示例2
输入: [4, 3, 2, 1]
输出: []
题目分析
我们以[4, 6, 7, 7]
为例子
- 一开始我们的数组为
array = [4,6,7,7]
, 结果集为result = []
, 暂存结果集为prefix = []
, 遍历数组 - 遍历开始,值为
4
, 放入暂存结果集,此时prefix = [4]
, 我们暂时不考虑顺序和是否重复,把剩下的数组继续递归遍历 - 此时
array = [6, 7, 7]
, 把6
取出来,prefix = [4, 6]
, 此时 prefix 的长度 >= 2 放入 result,此时result = [[4, 6]]
, 把剩下的[7,7]
继续递归,回溯之后这层可以整result = [[4,6],[4,7],[4,7]]
, 不过这是回溯之后的结果 - 此时
array = [7, 7]
,prefix = [4, 6]
,reuslt = [[4, 6]]
; 执行操作像上面一步
实现代码
/**
* @param {number[]} nums
* @return {number[][]}
*/
var findSubsequences = function(nums) {
let result = [];
contribute(result, nums, [])
return result
};
var contribute = function(result, array, prefix) {
let length = array.length;
if(length == 0) {
return result;
}
let isInlcude = [];
for(let i = 0; i < length; i++) {
if(isInlcude.includes(array[i])) { // 去重
continue;
}
const last = prefix.length > 0 ? prefix[prefix.length - 1] : null;
// 如果prefix 的最后一个数 比当前数要大,那就不符合,例如 prefix = [4, 5]; 此时last 应该是5,array[i] = 1, 5>1不符合题意
if(last !== null && last > array[i]) {
continue;
}
const temp = prefix.concat(array[i]);
isInlcude.push(array[i])
if(temp.length > 1) {
result.push(temp);
}
contribute(result, array.slice(i + 1, array.length), temp);
}
return result
}