[路飞]_js算法:leetcode 491-递增子序列

204 阅读1分钟

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 
}