本文共 1057 字,大约阅读时间需要 3 分钟。
class Solution(object): def findSubsequences(self, nums): """nums: List[int]""" if not nums: return [] result = [] path = [] n = len(nums) def trace(start): if len(path) >= 2: result.append(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这个算法通过递归的方式遍历所有可能的子序列,并使用memoization技术来避免重复计算。具体来说,它维护了一个路径记录当前选择的数字序列,以及一个集合来记录已经访问过的数字,以防止重复选择相同的数字。这样可以有效地去重,确保每个子序列都是唯一的。
在时间复杂度方面,尽管看起来是O(n * 2^n),但由于递归函数中有剪枝操作(比如通过memo来跳过已经处理过的数字),实际上的复杂度会有所优化,但仍然保持在O(n * 2^n)的级别。空间复杂度方面,path和memo都只占用O(n)的空间,这使得算法在空间上非常高效。
转载地址:http://tylyz.baihongyu.com/