代码改变世界

[LeetCode] 491. Increasing Subsequences_Medium tag: backtracking

2021-06-07 18:10  Johnson_强生仔仔  阅读(34)  评论(0编辑  收藏  举报

Given an integer array nums, return all the different possible increasing subsequences of the given array with at least two elements. You may return the answer in any order.

The given array may contain duplicates, and two equal integers should also be considered a special case of increasing sequence.

 

Example 1:

Input: nums = [4,6,7,7]
Output: [[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

Example 2:

Input: nums = [4,4,3,2,1]
Output: [[4,4]]

 

Constraints:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

 

Use [LeetCode] 90.Subsets II tag: backtracking 的方法,但是因为没有办法sort这个nums,所以添加一个visited,来判断是否要跳过这个元素。

Time: O(2 ^ n)     Space: O(n ^2)

code:

class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        ans = []
        def helper(nums, ans, temp, pos):
            if len(temp) > 1:
                ans.append(temp)
            visited = set()
            for i in range(pos, len(nums)):
                if nums[i] in visited: # this one must exist otherwise will have duplicates
                    continue
                if not temp or temp[-1] <= nums[i]:
                    visited.add(nums[i])
                    helper(nums, ans, temp + [nums[i]], i + 1)
        helper(nums, ans, [], 0)
        return ans