不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
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 里面存在数据 的情况下:
-
- 如果后面一个比前面一个小, 那么跳过
-
- 如果这个数据用过, 那么 跳过
- 如果在同一层 中使用过那么就不能再使用了,因为 当前这个数如果使用了, 那么这个数所有的组合其实已经存在的,那么你这个数就属于多余的了, 所以直接跳过
- 使用后设置为 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()
}
}
};