• 初学python记录:力扣39. 组合总和


    题目:

    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

    candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

    对于给定的输入,保证和为 target 的不同组合数少于 150 个。

    提示:

    • 1 <= candidates.length <= 30
    • 2 <= candidates[i] <= 40
    • candidates 的所有元素 互不相同
    • 1 <= target <= 40

    思考:

    因为要找到所有和为target的组合,可以构建一棵树,根节点为target,每条路径的值为candidates中的数,路径连接的子节点即为 父节点-路径值 ,保证只有所有叶子节点的值为0(从根节点到叶子节点0的路径即为所求的一个组合)小于0(这条路径代表的组合不能满足和为target的条件)。以示例1为例,上述思路如下图所示:

    可以看到找出了所有满足条件的组合,代码如下:

    1. class Solution(object):
    2. def combinationSum(self, candidates, target):
    3. """
    4. :type candidates: List[int]
    5. :type target: int
    6. :rtype: List[List[int]]
    7. """
    8. n = len(candidates)
    9. ans = []
    10. candidates.sort()
    11. def makeTree(target, candidates, path, ans):
    12. if target < 0:
    13. return
    14. elif target == 0:
    15. ans.append(path)
    16. return
    17. else:
    18. for index in range(0, n):
    19. makeTree(target - candidates[index], candidates, path + [candidates[index]], ans)
    20. makeTree(target, candidates, [], ans)
    21. return ans

    但是可以看到结果中出现了顺序不同,但元素完全相同的组合,但题目中说明这种组合是同样的,不应该重复返回。在图中用绿色表示应该删去的分支:

     

    可以总结出:每一层的第二个节点生成子节点的路径值不能使用生成他的前序兄弟节点的路径值。

    这样就避免了重复组合的出现,代码如下:

    1. class Solution(object):
    2. def combinationSum(self, candidates, target):
    3. """
    4. :type candidates: List[int]
    5. :type target: int
    6. :rtype: List[List[int]]
    7. """
    8. n = len(candidates)
    9. ans = []
    10. candidates.sort()
    11. def makeTree(target, candidates, path, ans, begin_index):
    12. if target < 0:
    13. return
    14. elif target == 0:
    15. ans.append(path)
    16. return
    17. else:
    18. for index in range(begin_index, n):
    19. makeTree(target - candidates[index], candidates, path + [candidates[index]], ans, index)
    20. makeTree(target, candidates, [], ans, 0)
    21. return ans

    提交通过:

  • 相关阅读:
    DHCP协议从入门到部署DHCP服务器进行实验
    egg中使用Sequelize老报错?看了这篇相信你会有思路……
    mysql面试题32:MySQL数据库服务器性能分析的方法命令有哪些?
    国庆作业4
    Tomcat
    剑指Offer面试题解总结31~40
    基于AidLux+YOLOv5+ByteTrack实现街道人流统计
    聚焦AIGC落地,八仙过海,谁更神通?
    Swift方法mutating关键字的本质
    【Android音视频开发】音频编码原理
  • 原文地址:https://blog.csdn.net/Demo0219/article/details/137996412