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()