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):returnuset=set()for i in range(index,len(nums)):if nums[i] in uset:continueif len(path)!=0 and nums[i]<path[-1]:continuepath.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