给你一个整数数组 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]]
示例 2:
输入:nums = [4,4,3,2,1]
输出:[[4,4]]
提示:
1 <= nums.length <= 15
-100 <= nums[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/increasing-subsequences
参考:
python
# 0491.递增子序列
class Solution:
def findSubSequences(self, nums: [int]) -> [[int]]:
res = []
path = []
def track(nums, startIndex):
repeat = [] # 数组去重
if len(path) >= 2:
res.append(path[:]) # 不加return,需要取树上的节点
for i in range(startIndex, len(nums)):
if nums[i] in repeat:
continue
if len(path) >= 1:
if nums[i] < path[-1]:
continue
repeat.append(nums[i]) # 记录在本层已经使用过,后面不再使用
path.append(nums[i])
track(nums, i+1)
path.pop()
track(nums, 0)
return res
golang
package backTrack
func findSubsequences(nums []int) [][]int {
var subRes []int
var res [][]int
trackSub(0, nums,subRes,&res)
return res
}
func trackSub(startIndex int, nums, subRes []int, res *[][]int) {
if len(subRes) > 1 {
tmp := make([]int, len(subRes))
copy(tmp, subRes)
*res = append(*res, tmp)
}
history := [201]int{} // -100 <= nums[i]<=100
for i:=startIndex;i<len(nums);i++ {
// 两种情况,1.当前元素小于子集的最后元素,应该continue,
//2.当前取的元素本层已经出现过,跳过继续寻找
if len(subRes)>0 && nums[i] < subRes[len(subRes)-1] || history[nums[i]+100] ==1 {
continue
}
history[nums[i]+100] = 1 // 表示本层元素已经使用过
subRes = append(subRes, nums[i]) // 处理添加进子集
trackSub(i+1, nums,subRes,res) // 递归
subRes = subRes[:len(subRes)-1] // 回溯
}
}