【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)的空间