看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给你一个整数数组 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
解题思路
- 我们定义
res用来存放结果 - 我们用一个
set存储每个合格的path,下次遇到重复的,不让它加入解集 - 从
start向后遍历数组,选合适的数推入path。path也作为参数进入递归。 - 在递归过程中,不断选数字入
path。 - 当
start指针到达边界,能选的都选了,没有数字可选了,结束递归。
解题代码
var findSubsequences = function(nums) {
const res = [];
const len = nums.length;
const set = new Set();
const dfs = (start,path)=>{
if (path.length >= 2) {
const str = path.toString()
if(!set.has(str)){
res.push(path.slice())
set.add(str)
}
}
for(let i = start;i<len;i++){
const pre = path[path.length-1]
const cur = nums[i]
if(path.length==0||pre<=cur){
dfs(i+1,[...path,cur])
}
}
};
dfs(0, []);
return res
};
如有任何问题或建议,欢迎留言讨论!