【Leetcode刷题】递增子序列

https://leetcode-cn.com/problems/increasing-subsequences/

class Solution(object):
    def findSubsequences(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if not nums:
            return []
        # 记录结果,需要去重
        result = []
        # 记录当前路径
        path = []
        n = len(nums)

        # 从nums的哪一位开始深度搜索
        def trace(start):
            if len(path) >= 2:
                # 用切片产生的新对象指向当前path数据,并记录新对象
                result.append(path[:])
            # 如何去重:令每一层遍历不使用相同的数字
            # 记录曾经添加到path中的数字
            memo = set()
            for i in range(start, n):
                # 已经遍历过的数字
                if nums[i] in memo:
                    continue

                if not path:
                    path.append(nums[i])
                elif nums[i] >= path[-1]:
                    path.append(nums[i])
                else:
                    continue
                memo.add(nums[i])
                trace(i + 1)
                path.pop()

        trace(0)
        return result

时间复杂度:O(n*2n)。需要遍历每个元素,枚举所有子序列的时间代价是O(2n)

空间复杂度:O(n)。path和memo都需要O(n)的空间

原文地址:https://www.cnblogs.com/luozx207/p/13561009.html