leetcode 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]]
思路: 一开始想着用动态规划 不过超时了。。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var findSubsequences = function(nums) {
if(!nums.length){
return nums;
}
let lts=new Array(nums.length).fill([[nums[0]]]);
for(let i=1;i<nums.length;i++){
lts[i]=[[nums[i]]];
for(let j=0;j<i;j++){
if(nums[j]<=nums[i]){
for(let x=0;x<lts[j].length;x++){
lts[i].push(lts[j][x].concat(nums[i]))
}
}
}
}
let res=[];
for(let i=0;i<lts.length;i++){
for(let j=0;j<lts[i].length;j++){
let boo=res.filter(item=>{
return item.toString()==lts[i][j].toString()
})
console.log(boo)
if(lts[i][j].length>1&&!boo.length){
res.push(lts[i][j])
}
}
}
return res
};
思路2 :从前往后看每个值,对当前值,再往后看(递归),遇到递增的数组就放到结果数组中
/**
* @param {number[]} nums
* @return {number[][]}
*/
var findSubsequences = function(nums) {
let res=[];
getResult(nums,0,[],res);
return res
};
function getResult(nums,k,buff,res){
if(buff.length>1)res.push(buff);
let map=new Set();
for(let i=k;i<nums.length;i++){
if(map.has(nums[i])) continue;
if (buff.length<1||nums[i]>=buff[buff.length-1]){
map.add(nums[i]);
const temp=buff.slice() //不能直接修改buff的值,因为在最外层循环时,buff都是从空开始的
temp.push(nums[i])
getResult(nums,i+1,temp,res)
}
}
return
}