题目
给你一个整数数组 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