首页 > 其他分享 >leetcode -- Subsets I &II-- 重点,求0,1序列

leetcode -- Subsets I &II-- 重点,求0,1序列

时间:2023-06-29 12:32:12浏览次数:37  
标签:return Subsets nums -- res self dfs II subres


Subsets

https://leetcode.com/problems/subsets/

思路1


这里其实就是把Combination拿到题目的思路2,收集那种组合树所有root到其余节点(不包括root本身)path。

class Solution:
    # @param S, a list of integer
    # @return a list of lists of integer

    def subsets(self, S):
        def dfs(depth, start, valuelist):
            res.append(valuelist)#回溯的时候 每一层都要记录为结果就行
            if depth == len(S): return
            for i in range(start, len(S)):
                dfs(depth+1, i+1, valuelist+[S[i]])#这里注意是使用的+一个list,即valuelist并没有被传入递归函数中,所以当这个函数返回之后,valuelist并没有变。例如,递归完左子树返回之后,valuelist依然还是递归左子树之前的值。这里传入的是合并的list,属于一个新list
                #所以这里其实是用python语言的特点,使得在模板中提到的改变变量->递归所有子节点->恢复变量的过程简化了
        S.sort()
        res = []
        dfs(0, 0, [])
        return res

思路2

类似与combination. 利用backtracking的模板

class Solution(object):

    def dfs(self, m, nums, subres, res):

        if m >= len(nums):
            tmp = [nums[i] for i,c in enumerate(subres) if c == 1]
            tmp.sort()
            res.append(tmp)
            return
        else:
            subres[m] = 0
            self.dfs(m+1, nums, subres, res)
            subres[m] = 1
            self.dfs(m+1, nums, subres, res)

    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        subres = [0]*len(nums)
        res = []
        self.dfs(0, nums, subres, res)
        return res

思路2

还可以用bitmap的办法做
http://algorithm.yuanbin.me/zh-cn/exhaustive_search/subsets.html

自己重写code

class Solution(object):

    def dfs(self, candidates, start, end, subres, res):
        res.append(subres)
        for i in xrange(start, end):
            self.dfs(candidates, i + 1, end, subres + [candidates[i]], res)

    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        res = []
        self.dfs(nums, 0, len(nums), [], res)
        return res

Subsets II

https://leetcode.com/problems/subsets-ii/

思路1


class Solution:
    # @param num, a list of integer
    # @return a list of lists of integer
    def subsetsWithDup(self, S):
        def dfs(depth, start, valuelist):
            if valuelist not in res: res.append(valuelist)
            if depth == len(S): return
            for i in range(start, len(S)):
                dfs(depth+1, i+1, valuelist+[S[i]])
        S.sort()
        res = []
        dfs(0, 0, [])
        return res

思路2

加上一个判断重复的条件即可

class Solution(object):

    def dfs(self, m, nums, subres, res):

        if m >= len(nums):
            tmp = [nums[i] for i,c in enumerate(subres) if c == 1]
            tmp.sort()
            if tmp not in res:#加上这个条件即可
                res.append(tmp)
            return
        else:
            subres[m] = 0
            self.dfs(m+1, nums, subres, res)
            subres[m] = 1
            self.dfs(m+1, nums, subres, res)


    def subsetsWithDup(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        subres = [0]*len(nums)
        res = []
        self.dfs(0, nums, subres, res)
        return res

自己重写code

class Solution(object):


    def dfs(self, candidates, start, end, subres, res):
        if subres not in res: res.append(subres)
        for i in xrange(start, end):
            self.dfs(candidates, i + 1, end, subres + [candidates[i]], res)

    def subsetsWithDup(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        res = []
        self.dfs(nums, 0, len(nums), [], res)
        return res


标签:return,Subsets,nums,--,res,self,dfs,II,subres
From: https://blog.51cto.com/u_16172916/6581407

相关文章

  • C++ 编程中的核心知识点!
    const作用修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointertoconst)和自身是常量的指针(常量指针,constpointer);修饰引用,指向常量的引用(referencetoconst),用于形参类型,即避免了拷贝,又避免了函数对值的修改;修饰成员函数,说明该成员函数内不能修改成员......
  • Java 17 新特性
    如题:基于垃圾回收器的内存分配:Java17引入了垃圾回收器接口,允许开发人员实现自定义的垃圾回收器。这样可以提供更大的灵活性和性能优化的机会。  示例代码:1publicclassMyGarbageCollectorimplementsGarbageCollector{2//实现自定义的垃圾回收逻辑......
  • mysql: [Warning] Using a password on the command line interface can be insecure.
      https://zhuanlan.zhihu.com/p/542166965 ......
  • thinkphp6:使用view视图/模板(thinkphp v6.0.12LTS)
    一,在使用之前,需要用composer安装需要的view模块:参见:https://blog.imgtouch.com/index.php/2023/06/29/thinkphp6-bao-cuo-driver-think-not-supported/二,php代码:<?phpdeclare(strict_types=1);namespaceapp\controller;useapp\BaseController;usethink\fa......
  • Cake Assembly Line
    CakeAssemblyLinetimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputAcakeassemblylineinabakerywasonceagainoptimized,andnow n cakesaremadeatatime!Inthelaststep,eachof......
  • idea springboot本地打包配置
    cleanpackage-plrenren-admin-am-amd......
  • Kubernetes(k8s) Web-UI界面(一):部署和访问仪表板(Dashboard)
    目录一.系统环境二.前言三.仪表板(Dashboard)简介四.部署Kubernetes仪表板(Dashboard)五.访问Kubernetes仪表板(Dashboard)5.1使用token登录Dashboard5.2对sa账号kubernetes-dashboard授权5.3访问Dashboard六.总结七.附加信息一.系统环境本文主要基于Kubernetes1.21.9和Linux操作......
  • ETH-TCP协议与常见问题分析
    SourcePort:源端口,标识发送方的应用进程DestinationPort:目的端口,标识接收方的应用进程SequenceNumber:序列号,用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。保证数据传输的有序性......
  • flex布局
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • 4.2 多层感知机的从零开始实现
    本节实现一个单隐藏层的,具有256个隐藏单元的多层感知机,并且隐藏层使用ralu函数激活。注意,我们通常选择2的若干次幂作为层的隐藏单元数,因为内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。1.参数初始化我们用几个张量来表示我们的参数。注意,对于每一层我们都要记......