491--递增子序列

文章介绍了如何利用回溯算法解决寻找递增子序列的问题,强调在不排序的情况下,通过建立newSet来避免在递归过程中重复使用同一元素,从而保证子序列的递增性。newSet的特性在于存储唯一元素,适合于数组去重。题解中详细展示了算法实现过程,包括关键的回溯函数backtracking以及newSet在去重中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

491--递增子序列

题目

分析
  1. 一般来说正常的回溯题都是最好先排序,但是此题要求的题解是递增子序列,所以不能第一步就排序,回溯排序的目的是为了我们方便搜索树

  1. 此题还有一点树的每一层递归,要做到去重,就是每一层用过的元素,不能再用第二次,因此,我们可以多设置一个 new Set(),来判定是否这一层的递归有用过这个元素

es6--new Set()

类似数组,但它的一大特性就是所有元素都是唯一的,没有重复的。可以利用这一特性进行数组的去重工作。

  • 常用方法

  • 添加元素 add()

        let list=new Set();
        list.add(1)
  • 删除元素 delete(),删除数值

  • 判断某元素是否存在 has(),有返回true,无返回false

  • 清除所有元素 clear()

  • 遍历 keys()

letlist2=newSet(['a','b','c'])
for(letkeyoflist2.keys()){
   console.log(key)//a,b,c
}
  • 遍历 values()

letlist=newSet(['a','b','c'])
for(letvalueoflist.values()){
console.log(value)//a,b,c
}
  • 遍历 foreach()

letlist=newSet(['4','5','hello'])
list.forEach(function(item){
  console.log(item)
})
  • 数组转set(用于数组去重)

letset2=newSet([4,5,6])
  • set转数组

letset4=newSet([4, 5, 6])
//方法一   es6的...解构
letarr1=  [...set4];
//方法二  Array.from()解析类数组为数组
letarr2=Array.from(set4)

题解
varfindSubsequences=function(nums) {
     // 此题的要求是不能排序
     letres=[],path=[]
     letlen=nums.length
     backtracking(0)
     returnres
    
     functionbacktracking(startIndex){
        if(path.length>1){
    
     res.push(Array.from(path))
     }
     // 这里 new Set(),目的是为了记录这一层递归的时候是否出现过,因为每一层递归的元素不能重复
     letsetPath=newSet()
    for(leti=startIndex;i<len;i++){
     // 2.去重,如果有重复的元素,就跳过这个元素,进行下一个元素的搜索
     if(path.length>0&&nums[i]<path[path.length-1]||setPath.has(nums[i])){
     continue
    }
     // 给满足以上条件的元素添加到 刚刚 建的setPath中,
    // 那么为什么不用像path一样清除它呢
     // 因为每一层递归结束后,我们这第一轮for循环都会结束,然后重新传参,进行下一层的递归,
    //  在进行下一层的递归前,又重新定义了一个 new Set()
     // 做到了这个setPath中只记录本层的元素,检验本层元素是否有重复使用过,
    //  而不是检查整一个树是否有重复使用过这个元素
     setPath.add(nums[i])
     path.push(nums[i])
     backtracking(i+1)
     path.pop()
    
    
     }
    }
    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值