• 0491递增子序列 Marathon


    给你一个整数数组 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] // 回溯
    
    	}
    }
    
  • 相关阅读:
    notepad++ 在所有行末尾增加符号
    Linux
    [论文阅读] MIR音乐信息检索3
    GitLab CE 常规配置与命令 零点
    Java线程学习之Condition条件
    Java线程学习之ReentrantLock锁
    Java线程学习之读写锁
    PyQt(三) 常见控件二
    PyQt5(四) 线程与绘图处理
    Python 开发规范
  • 原文地址:https://www.cnblogs.com/davis12/p/15591489.html
Copyright © 2020-2023  润新知