491. 非递减子序列 - 力扣(LeetCode)
思路:重点是去重
收集结果:每次进入递归先判断path中的元素数量,如果大于1了,就将path收集到result中。
递归参数:nums,index,path
递归出口:当遍历完nums时return
单层递归逻辑:(使用集合来去重)定义一个uset来记录已经遍历过的元素。
- i从index遍历到nums结束:如果当前元素已经遍历过了,continue;如果当前元素比path中最后一个元素小,不符合非递减,continue。
- 将当前元素加入path数组中和uset集合中,调用递归函数,pop出path的最后一个元素。
class Solution(object):
def back(self,nums,index,path):
if len(path)>=2:
self.result.append(path[:])
if nums==len(nums):
return
uset=set()
for i in range(index,len(nums)):
if nums[i] in uset:
continue
if len(path)!=0 and nums[i]<path[-1]:
continue
path.append(nums[i])
uset.add(nums[i])
self.back(nums,i+1,path)
path.pop()
def findSubsequences(self, nums):
self.result=[]
self.back(nums,0,[])
return self.result