iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++回溯算法中组合的相关问题分析
  • 502
分享到

C++回溯算法中组合的相关问题分析

C++回溯算法组合C++回溯算法 2023-03-15 11:03:43 502人浏览 安东尼
摘要

目录一、组合二、组合总和III与组合总和1.组合总和III2.组合总和3.组合总和II三、电话号码的字母组合 回溯算法模板 void backtracking(参数) { 

回溯算法模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }
    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

回溯问题,最关键的是画出二叉树,遍历、剪枝问题都要通过直观的观察才能总结

一、组合

剪枝策略

已经选择的元素个数:path.size();

还需要的元素个数为: k - path.size();

在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int n,int k,int startIndex){
        if(path.size()==k){
            result.push_back(path);
            return;
        }
        for(int i=startIndex;i<=n-(k-path.size())+1;i++){
            path.push_back(i);
            backtracking(n,k,i+1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        backtracking(n,k,1);
        return result;
    }
};

二、组合总和III与组合总和

1.组合总和III

在组合的基础上,多了一个求和的操作,求和也可以剪枝

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int sum,int k,int n,int startIndex){
        if(sum>n) return;
        if(path.size()==k){
            if(sum==n) result.push_back(path);
            return;
        }
        for(int i=startIndex;i<=9-(k-path.size())+1;i++){
            path.push_back(i);
            sum+=i;
            backtracking(sum,k,n,i+1);
            sum-=i;
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(0,k,n,1);
        return result;
    }
};

2.组合总和

本题与组合III的区别在于,不限制组合内数字的个数,且同一个数字可以无限制重复被选取,体现在代码上就是,向下递归的时候,i不变

class Solution {
private:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& candidates, int target,int index,int sum){
        if(sum>target) return;
        if(sum==target){
            result.push_back(path);
            return;
        }
        for(int i=index;i<candidates.size();i++){
            path.push_back(candidates[i]);
            sum+=candidates[i];
            backtracking(candidates,target,i,sum);
            sum-=candidates[i];
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        backtracking(candidates,target,0,0);
        return result;
    }
};

3.组合总和II

本题和组合总和的区别在于,输入样例中含有重复元素时,输出样例不能有重复元素

同一条枝干上,元素可以相同;而不同的枝干则不能重复

即:横向遍历不能重复、纵向遍历可以重复

class Solution {
private:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& candidates, int target,int index,int sum){
        if(sum>target) return;
        if(sum==target){
            result.push_back(path);
            return;
        }
        for(int i=index;i<candidates.size();i++){
            if(i>index&&candidates[i]==candidates[i-1])
                continue;
            path.push_back(candidates[i]);
            sum+=candidates[i];
            backtracking(candidates,target,i+1,sum);
            sum-=candidates[i];
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtracking(candidates,target,0,0);
        return result;
    }
};

三、电话号码的字母组合

这题很好的考察了:for循环横向遍历、递归纵向遍历的知识点

class Solution {
private:
    const string letterMap[10]={
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz"
    };
public:
    string path;
    vector<string> result;
    void backtracking(string digits,int index){
        if(index==digits.size()){
            result.push_back(path);
            return;
        }
        int digit=digits[index]-'0';
        string letter=letterMap[digit];
        for(int i=0;i<letter.size();i++){
            path.push_back(letter[i]);
            backtracking(digits,index+1);
            path.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0)
            return result;
        backtracking(digits,0);
        return result;
    }
};

到此这篇关于c++回溯算法中组合的相关问题分析的文章就介绍到这了,更多相关C++回溯算法组合内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++回溯算法中组合的相关问题分析

本文链接: https://www.lsjlt.com/news/199892.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++回溯算法中组合的相关问题分析
    目录一、组合二、组合总和III与组合总和1.组合总和III2.组合总和3.组合总和II三、电话号码的字母组合 回溯算法模板 void backtracking(参数) { ...
    99+
    2023-03-15
    C++回溯算法组合 C++回溯算法
  • C++回溯算法中组合的相关问题怎么解决
    这篇文章主要讲解了“C++回溯算法中组合的相关问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++回溯算法中组合的相关问题怎么解决”吧!回溯算法模板void backtracki...
    99+
    2023-07-05
  • C++回溯算法中子集问题分析探讨
    目录一、子集二、子集II三、递增子序列 一、子集 子集问题与其它问题最大的不同就是:每次递归,不止考虑叶子节点,而是考虑所有节点! 体现在代码上,就是每次递归都先result.pus...
    99+
    2023-03-15
    C++回溯算法子集 C++回溯算法 C++子集问题
  • C++回溯算法中的全排列问题分析探讨
    目录一、全排列二、全排列II 一、全排列 全排列的特点就是:解放了index(每次遍历都从0开始),但是解放index的同时,又捆绑了used数组,记录已经出现过的元素 class ...
    99+
    2023-03-15
    C++回溯算法全排列 C++回溯算法 C++全排列问题
  • 通过Java组合问题看透回溯法
    目录前言题目解法解法一解法二C++实现总结前言 已经好久没有更新了,从今天开始要保证每周的更新频率了(立个flag,应该能够想到打脸会来的很快),今天给大家分享一道LeetCode算...
    99+
    2024-04-02
  • C++回溯算法中子集问题如何解决
    这篇文章主要介绍了C++回溯算法中子集问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++回溯算法中子集问题如何解决文章都会有所收获,下面我们一起来看看吧。一、子集子集问题与其它问题最大的不同就是:...
    99+
    2023-07-05
  • php回溯算法计算组合总和的方法
    本文小编为大家详细介绍“php回溯算法计算组合总和的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“php回溯算法计算组合总和的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
  • C++回溯算法中的全排列问题怎么解决
    本文小编为大家详细介绍“C++回溯算法中的全排列问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++回溯算法中的全排列问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、全排列全排列的特点...
    99+
    2023-07-05
  • C++回溯与分支限界算法分别解决背包问题详解
    目录算法思想回溯代码分支限界代码算法思想 分支限界法与回溯法的求解目标不同。 回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,...
    99+
    2024-04-02
  • php中怎么利用回溯算法计算组合总和
    php中怎么利用回溯算法计算组合总和,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。给定一个数组 candidates 和一个目标数 target ,找出 candidate...
    99+
    2023-06-20
  • C++回溯算法深度优先搜索的示例分析
    小编给大家分享一下C++回溯算法深度优先搜索的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!扑克牌全排列假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张牌分别放到3个盒子中去,且每个盒子只能...
    99+
    2023-06-29
  • C++回溯算法深度优先搜索举例分析
    目录扑克牌全排列员工的重要性图像渲染被围绕的区域岛屿数量电话号码的字母组合组合总数活字印书N皇后扑克牌全排列 假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张...
    99+
    2024-04-02
  • php回溯算法计算组合总和的实例代码
    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组...
    99+
    2024-04-02
  • C++回溯算法广度优先搜索举例分析
    目录迷宫问题N叉树的层序遍历腐烂的橘子单词接龙打开转盘锁迷宫问题 假设有一个迷宫,里面有障碍物,迷宫用二维矩阵表示,标记为0的地方表示可以通过,标记为1的地方表示障碍物,不能通过。现...
    99+
    2024-04-02
  • C语言回溯法解八皇后问题(八皇后算法)
    八皇后问题(N皇后问题)的回溯法求解 一、问题描述 在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况。 二、参考资料 啥文字都...
    99+
    2024-04-02
  • J2EE Web组件中中文及相关问题的示例分析
    这篇文章给大家分享的是有关J2EE Web组件中中文及相关问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 XML:namespace prefix = o ns = "urn:s...
    99+
    2023-06-03
  • 怎样分析MySQL中锁的相关问题
    这篇文章给大家介绍怎样分析MySQL中锁的相关问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。锁分类:从对数据操作的粒度分 :表锁:操作时,会锁定整个表。行锁:操作时,会锁定当前操作行。从对数据操作的类型分:读锁(共...
    99+
    2023-06-22
  • C语言一维数组算法问题的示例分析
    这篇文章给大家分享的是有关C语言一维数组算法问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题1:将数组中的数逆序存放本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按...
    99+
    2023-06-25
  • C++ 递归函数在回溯算法中的应用?
    递归函数在回溯算法中通过深度优先搜索决策树来解决问题:函数调用自身,探索决策树的分支。针对问题,函数会不断深入探索树状结构,并在做出错误决策后进行回溯。实战案例:八皇后问题中,函数通过递...
    99+
    2024-04-24
    递归函数 回溯算法 c++
  • java编程中拷贝数组的方式及相关问题分析
    JAVA数组的复制是引用传递,而并不是其他语言的值传递。这里介绍java数组复制的4种方式极其问题:第一种方式利用for循环:int[] a={1,2,4,6};int length=a.length;int[] b=new int[len...
    99+
    2023-05-30
    java 数组复制 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作