LeetCode 491. 递增子序列

题目

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

例:
输入: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]]

方法:回溯、递归
  • path 表示单个递增子序列,result 表示所有递增子序列,startIndex 表示起始索引

backtrack 函数: 回溯

  • 因为递增子序列中至少有两个元素,所以当 path 的长度大于等于 2 时满足要求,将其加入 result
  • 若索引起始值等于数组的长度时,表示已在数组结尾,那么终止操作
  • use 表示在该层的已使用过的元素,用于之后的重复测试
  • 通过循环得到 path。若即将加入 path 的元素不为 path 中的第一个元素,且其值小于 path 中最后一个元素值,那么跳过该次循环;若即将加入 path 的元素为该层已使用过的元素,那么跳过该次循环;否则,将该元素值加入该层的 use,表示该层已使用过该元素,将该元素加入 path,调用 backtrack 函数,移除末尾元素
class Solution(object):
    def findSubsequences(self, nums):
        path, result = [], []

        def backtrack(nums, startIndex):
            if len(path) >= 2:
                result.append(path[:])
            if startIndex == len(nums):
                return None

            use = set()
            for i in range(startIndex, len(nums)):
                if (path and path[-1] > nums[i]) or nums[i] in use:
                    continue
                
                use.add(nums[i])
                path.append(nums[i])
                backtrack(nums, i + 1)
                path.pop()
        
        backtrack(nums, 0)
        return result

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

相关知识
  • set(): a = set()
    创建一个无序不重复元素集
    增加元素: a.add()
参考

代码相关:https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html
set():https://www.runoob.com/python/python-func-set.html

你可能感兴趣的:(LeetCode 491. 递增子序列)