首页 > 编程语言 >C++数据结构与算法——回溯算法组合问题

C++数据结构与算法——回溯算法组合问题

时间:2024-04-06 16:30:44浏览次数:23  
标签:int back C++ 算法 vector candidates result 回溯 path

C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!

文章目录

一、77. 组合

在这里插入图片描述

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

在这里插入图片描述

二、216. 组合总和 III

在这里插入图片描述

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

在这里插入图片描述

三、17. 电话号码的字母组合

在这里插入图片描述

class Solution {
public:
    vector<string> result;
    string s="";
    string stringV[10] = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz"
    };
    vector<string> letterCombinations(string digits) {
        insertString(digits,0);
        return result;
    }
    void insertString(string digits,int index){
        if(index==digits.size()){
            // 收获结果
            if(s==""){
                return;
            }
            result.push_back(s);
            return ;
        }
        int digit = digits[index]-'0';
        string nextS = stringV[digit];
        // 遍历
        for(int i=0;i<nextS.size();i++){
            s+= nextS[i];
            insertString(digits,index+1);
            s.pop_back();
        }
    }
};

在这里插入图片描述

四、39. 组合总和

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    int Asum =0;
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        insertV(candidates,target,0);
        return result;
    }
    void insertV(vector<int> candidates,int target,int startIndex){
        if(Asum==target){
            // 收获结果
            result.push_back(path);
            return;
        }
        else if(Asum>target){
            return;
        }
        for(int i=startIndex;i<candidates.size();i++){
            path.push_back(candidates[i]);
            Asum+=candidates[i];
            insertV(candidates,target,i);
            // 回溯
            path.pop_back();
            Asum-=candidates[i];
        }
    }
};

在这里插入图片描述

五、40. 组合总和 II

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    int Asum;
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        // 首先进行排序
        sort(candidates.begin(),candidates.end());
        vector<bool> used(candidates.size(),false); // 和candidates等长,并且全为0;
        insertS(candidates,target,0,used);
        return result;
    }
    void insertS(vector<int> candidates,int target,int startIndex,vector<bool> used){
        if(Asum==target){
            result.push_back(path);
            return;
        }
        if(Asum>target){
            return;
        }
        // 用一个used数组表示是否使用过
        for(int i=startIndex;i<candidates.size();i++){
            if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
                continue;
            }
            path.push_back(candidates[i]);
            Asum+= candidates[i];
            used[i] = true;
            insertS(candidates,target,i+1,used);
            used[i] =false;
            path.pop_back();
            Asum-= candidates[i];
        }
    }
};

在这里插入图片描述

标签:int,back,C++,算法,vector,candidates,result,回溯,path
From: https://blog.csdn.net/weixin_63866037/article/details/137399636

相关文章

  • 【数据结构与算法】:直接插入排序和希尔排序
    1.排序的概念及其意义1.1排序的概念所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。1.2排序的稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[......
  • 16天【代码随想录算法训练营34期】第六章 二叉树part03(● 104.二叉树的最大深度 559
    104.二叉树的最大深度#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defmaxDepth(self,root:O......
  • C++ this指针的概念和使用
    this指针的概念:在C++中成员变量和成员函数是分开存储的。每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分哪个对象调用自己的呢?c++通过提供特殊的对象指针,this指针,解决上述问题。关键:this指针指向......
  • C++中拷贝构造函数调用时机——学习记录
    拷贝构造函数调用时机:C++中拷贝构造函数调用时机通常有三种情况使用一个已经创建完毕的对象来初始化一个新对象值传递的方式给函数参数传值以值方式返回局部对象问题描述在黑马C++课程上学习时发现,第三种情况:以值方式返回局部对象时会不会调用构造函数。对比后发现,黑......
  • 封装一个生成唯一ID算法的工具类
    导入maven依赖:<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.6.0</version></dependency><dependency>......
  • socket编程——C++实现基于UDP协议的简单通信(含详解)
    文章后面有代码,可以直接复制在VisualStudio2022中运行(注意:必须是两个项目,客户端服务端各一个,连接在同一网络中,先运行服务端,并且客户端数据发送的目标IP要改为你服务端的IP)目录前言帮助文档一、UDP通信框架1.服务端2.客户端二、服务端实现1.加载库(WSAStartup函数)......
  • [C++] 小游戏 斗破苍穹2.8.1版本 zty出品
    前言大家好,今天zty带来的是首次增加调试角色的版本,2.8.1版本主要更新了调试角色(感觉没啥用)。先赞后看 养成习惯点赞过100一天更3次正文#include<stdio.h>#include<iostream>#include<ctime>#include<bits/stdc++.h>#include<time.h>//suiji#include<windows.h>/......
  • 【C++】二叉搜索数
    目录一、二叉搜索树的概念二、二叉搜索树的模拟实现1、定义节点2、构造二叉树3、析构二叉树​4、拷贝二叉树5、二叉树赋值6、插入节点......
  • 【三十五】【算法分析与设计】综合练习(2),22。 括号生成,77。 组合,494。 目标和,模拟树递
    22.括号生成数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1<=n<=8【三十五】【算法分析与设计】综合练习(2),......
  • C++之路
    C++与C语言的区别: C语言是面向过程的,面向函数的封装和函数的顺序调用的过程;c++面向对象开发即面向类开发——一个结构体就是一个对象,包含行为(函数),和属性(变量);  C++能够对函数进行重载,可以使用同名的函数,功能变得更强大,c++引入了名字空间,可以是定义的变量名更多(提升变量......