(3)回溯算法团灭子集、组合、排列问题 -- 元素无重可复选

这篇具有很好参考价值的文章主要介绍了(3)回溯算法团灭子集、组合、排列问题 -- 元素无重可复选。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回溯算法团灭子集、组合、排列问题
根据元素是否重复和是否可复选,分为以下三种变体:
1、元素无重不可复选
2、元素有重不可复选
3、元素无重可复选

该篇给出第三种情况的代码,另外两种的实现见上方变体链接。文章来源地址https://www.toymoban.com/news/detail-698079.html


class NoRepeatAndMultiple:
    """
    元素无重可复选
    """
    def subsets(self, nums: List[int], target) -> List[List[int]]:
        """
        相当于目标和问题
        :param nums:
        :param target:
        :return:
        """
        self.res = []
        self.track = []
        self.track_sum = 0
        self.s_backtrack(nums, 0, target)
        return self.res

    def s_backtrack(self, nums, start, target):
        #  base case
        if self.track_sum == target:
            self.res.append(self.track[:])
            return

        # base case
        if self.track_sum > target:
            return

        for i in range(start, len(nums)):
            # 做选择
            self.track_sum += nums[i]
            self.track.append(nums[i])

            # 通过 start 参数控制树枝的遍历,避免产⽣重复的⼦集
            self.s_backtrack(nums, i, target)

            # 撤销选择
            self.track_sum -= nums[i]
            self.track.pop()

    def combination(self, nums: List[int], k: int) -> List[List[int]]:
        """
        组合问题,这里等价于子集问题
        :param nums:
        :param k:
        :return:
        """
        pass

    def permute(self, nums: List[int]) -> List[List[int]]:
        """
        排列问题
        :param nums:
        :return:
        """
        self.res = []
        self.track = []
        self.p_backtrack(nums)
        return self.res

    def p_backtrack(self, nums):
        #  base case
        if len(self.track) == len(nums):
            self.res.append(self.track[:])
            return

        for i in range(0, len(nums)):

            # 做选择
            self.track.append(nums[i])

            # 通过 start 参数控制树枝的遍历,避免产⽣重复的⼦集
            self.p_backtrack(nums)

            # 撤销选择
            self.track.pop()

到了这里,关于(3)回溯算法团灭子集、组合、排列问题 -- 元素无重可复选的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 7-1 子集和问题--回溯法(算法设计与分析)

    作者 陈晓梅    单位 广东外语外贸大学 设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法,并输出利用回溯法在搜索树(按输入顺序建立)中找到的第一个解。 输入格

    2024年02月04日
    浏览(32)
  • 代码随想录-回溯算法(子集问题)|ACM模式

    目录 前言: 78. 子集 题目描述: 输入输出描述: 思路和想法: 90. 子集 II 题目描述: 输入输出描述: 思路和想法: 491. 递增子序列 题目描述: 输入输出描述: 思路和想法: 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话, 那么组合问题和分割问题都是收集

    2024年02月15日
    浏览(30)
  • LeetCode 1079. Letter Tile Possibilities【哈希表,回溯,动态规划,排列组合】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月10日
    浏览(39)
  • 代码随想录Day20 回溯算法 LeetCode77 组合问题

    以下内容更详细解释来自于:代码随想录 (programmercarl.com) 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实 有递归就有回溯 ,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能解决哪些问题.

    2024年02月08日
    浏览(33)
  • 子集和数问题(回溯法)

    【问题描述】给定一个n个整数的集合X={x1,x2,…xn}(X中可能包含重复元素)和整数y,找出和等于y的X的子集Y。例如说,如果X={10,30,20,60,40,50},和y=60,则有4种不同的解,他们分别是{10,20,30},{10,50},{20,40},{60}。 【输入形式】输入的第1行包含两个整数n和y,分别表示集合X的长度和目标

    2024年02月09日
    浏览(31)
  • 回溯法——求解子集和问题(Java)

    给定n个不同的正整数的集合w={w1,w2,…,wn}和一个正整数W,要求找出w的子集s, 使该子集中所有的元素的和为W 。例如,当n=4时,w={11,13,24,7},W=31,则满足要求的子集为(11,13,7)和(24,7)。 和0/1背包问题一样,该问题的解空间数是一颗子集树。设解向量x=(x1,

    2024年02月06日
    浏览(34)
  • 回溯算法篇-01:全排列

    这道题属于上一篇——“回溯算法解题框架与思路”中的 “元素不重复不可复用” 那一类中的 排列类问题。 我们来回顾一下当时是怎么说的: 排列和组合的区别在于,排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不同的结果。 这就导致了同一个元素 在同一条路径中不

    2024年01月20日
    浏览(26)
  • 力扣--深度优先算法/回溯算法47.全排列 Ⅱ

    思路分析: 使用DFS算法进行全排列,递归地尝试每个可能的排列方式。 使用 path 向量保存当前正在生成的排列,当其大小达到输入数组的大小时,将其加入结果集。 使用 numvisited 向量标记每个数字是否已经被访问过,以确保每个数字在一个排列中只使用一次。 在递归过程中

    2024年03月13日
    浏览(38)
  • leetcode--回溯算法.全排列(java)

    leetcode 46 原题链接-- 全排列 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2: 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例3: 输入:nums = [1

    2024年02月08日
    浏览(24)
  • leetcode46. 全排列(回溯算法-java)

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/permutations 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入:nums = [0,1] 输出:[[0,1],[1,0]]

    2024年02月11日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包