0491-递增子序列

给你一个整数数组 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] // 回溯

	}
}

posted on 2021-11-23 08:17  进击的davis  阅读(26)  评论(0编辑  收藏  举报

导航