491. 非递减子序列(中等)

https://leetcode.cn/problems/non-decreasing-subsequences/

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:
输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        # 难度:☆☆☆
        # 标签:回溯
        from copy import deepcopy
        path, result, n = [], [], len(nums)  # 回溯三剑客
        def backtrack(start):
            # 同78.子集,收集结果置于终止条件之前
            if len(path) >= 2:
                result.append(deepcopy(path))  # result.append(path[:])            
            # 终止条件,可忽略
            if start == n:
                return
            # 深度遍历中,每一层都会有一个全新的集合用于记录本层元素是否重复使用
            used = set()
            for i in range(start, n):
                # 若当前元素值小于前一个时(非递增)或者曾用过,跳入下一循环
                if (nums[i] in used) or (path and nums[i] < path[-1]):
                    continue
                used.add(nums[i])
                path.append(nums[i])
                backtrack(i + 1)
                path.pop()
        backtrack(0)
        return result

你可能感兴趣的:(回溯与子集组合排列切割,python,数据结构,算法,leetcode)