491. 递增子序列

该代码实现了一个寻找给定整数列表中所有长度大于等于2的递增子序列的算法。它使用回溯法,通过维护一个`path`来构建可能的子序列,并利用集合`used`去重。在回溯过程中,确保新元素大于路径中的最后一个元素。

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

2023.6.28
注意子序列不是子集,对于子集而言,子集中元素的顺序没有必要与原集合元素的顺序保持一致。而子序列要求其中元素的顺序也要与子集保持一致,因此这个题不能是单纯的像上个题一样加一个终止条件只回收长度大于2的子集。
因为要拿到子序列,这意味着原序列不能进行排序,而原序列中有重复元素,那么处理去重时不能使用if判断,换而使用集合used=set()进行去重。
此外由于只要递增序列,那么向path中添加新的元素值之前,必须要保证新的元素值大于path中最后一个元素值才能放入path中。

class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        self.nums = nums
        self.n = len(self.nums)
        self.used = [0] * self.n
        self.result = []
        self.path = []
        self.backtracking(0)
        return self.result
    
    def backtracking(self, startindex):
        if len(self.path) >= 2:
            self.result.append(self.path[:])

        used = set()
        for i in range(startindex, self.n):
            if self.nums[i] in used:  # 这个元素值本层用过就不再用了
                continue
            if self.path and self.nums[i] < self.path[-1]:  # 当前元素值小于已有path中的最后一个值,也不能使用
                continue
            used.add(self.nums[i])
            self.path.append(self.nums[i])
            self.backtracking(i+1)
            self.path.pop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值