首页 > 编程语言 >【每周例题】力扣 C++ 组合

【每周例题】力扣 C++ 组合

时间:2024-03-24 13:23:38浏览次数:34  
标签:temp 组合 int res C++ 力扣 vector 数组 例题

组合

题目

力扣 组合

 题目解析

1.我们可以根据题目分析可知,题目所要求我们做的是:从1到n进行遍历,找出k个数组成小组合,再将小组合拼接在一起成为大组合输出。

2.所以,根据题目,我们可以采用两个数组,一个一维数组temp,负责存储k个数,组为小组合,一个二维数组res,存储小组合,变为大组合。

下面为图解:

 3.这道题动用了回溯法(有递归即会出现回溯),想要了解的可以点击下面的链接:

回溯法

4.这题可以动用容器,我们可以把容器看为一个动态扩展的数组,想要了解容器的可以点击下面链接:

容器

代码:

#include<iostream>
#include<vector>
using namespace std;

class Solution 
{
    vector<vector<int>> res;//二维数组
    vector<int> temp;//一位数组 保存临时组合
public:
    void recursion(int i, int n, int k)//从i遍历到n,寻找长度为k的数组
    {
        if (temp.size() == k)
        {
            res.push_back(temp);//将当前组合添加到res
        }
        else if (i <= n)
        {
            temp.push_back(i);//在容器后添加一个元素
            recursion(i + 1, n, k);
            temp.pop_back();//删除添加的尾元素
            recursion(i + 1, n, k);
        }
    }

    vector<vector<int>> combine(int n, int k)
    {
        recursion(1, n, k);
        return res;
    }
};

代码调试解析:

想要理解上面的代码,可以运行下面的代码,必要时可以打断点进行调试:

#include <iostream>  
#include <vector>  

using namespace std;

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        recursion(1, n, k);
        return res;
    }

private:
    vector<vector<int>> res; // 存储所有组合的结果  
    vector<int> temp; // 存储当前组合  

    void recursion(int i, int n, int k) {
        // 打印当前递归的状态  
        cout << "递归调用: i = " << i << ", n = " << n << ", k = " << k << ", 当前组合: ";
        for (int num : temp) {
            cout << num << " ";
        }
        cout << endl;

        // 如果当前组合的长度等于k,则将其添加到结果中  
        if (temp.size() == k) {
            res.push_back(temp);
            // 打印找到的组合  
            cout << "找到一个组合: ";
            for (int num : temp) {
                cout << num << " ";
            }
            cout << endl;
            return; // 返回,避免进一步递归  
        }

        // 如果还有数字可以加入组合,则继续递归  
        if (i <= n) {
            // 尝试将当前数字i加入组合  
            temp.push_back(i);
            // 递归调用,尝试加入下一个数字  
            recursion(i + 1, n, k);
            // 移除当前数字i,尝试不加入它的情况  
            temp.pop_back();

            // 如果当前数字i不加入组合,则直接尝试下一个数字  
            // 注意:这里的递归调用不应该再次尝试加入当前数字i,因为我们已经尝试过  
            // 所以这里的调用应该与上一个调用使用相同的i值  
            recursion(i + 1, n, k);
        }
    }
};

int main() {
    Solution solution;
    int n = 4;
    int k = 2;
    vector<vector<int>> combinations = solution.combine(n, k);

    // 打印所有组合  
    cout << "所有组合:" << endl;
    for (const auto& combination : combinations) {
        for (int num : combination) {
            cout << num << " ";
        }
        cout << endl;
    }

    return 0;
}

 

标签:temp,组合,int,res,C++,力扣,vector,数组,例题
From: https://www.cnblogs.com/hcrzhi/p/18092304

相关文章

  • 【webserver】 C++ 项目webserver面试八股总结(二)
    32.一次网页的访问从URL开始,说一下整个访问的过程客户端获取URL->DNS解析->TCP连接->发送HTTP请求->服务器处理请求->返回报文->浏览器解析渲染页面->TCP断开连接客户端:(应用层开始)获取URL,通过负责域名解析的域名服务获取网址的IP地址,根据HTTP协......
  • 《大厂面试模拟(免费) - C++工程方向》
        以个人的名义,提供c++工程方向的大厂面试模拟,不会以任何形式收费。此面试可为应聘者提供真实反馈。简历和面试过程不会以任何形式给第三方(包括我当前所在公司)。我的经验:多年百度,阿里知名核心项目组工作经验面试100+人多年mentor经验,辅助多位新同学项目落地《构建......
  • c++ stl 之映射—— map 详解
     map是stl的一个关联容器,名叫“映射”,何为“映射”?其实就是一个数组,但有了数组何必还需映射,这是一个高深的问题。目录一、map简介         1.空间复杂度    2.时间复杂度     3.“键”的类型二、 map用法     1.声明  ......
  • C++面向对象编程 - 组合:C++中的组合是一种类与类之间的关系
    C++面向对象编程-组合在C++中,面向对象编程(Object-OrientedProgramming,简称OOP)是一种强大的编程范式,它允许我们通过类(Class)和对象(Object)的概念来组织和管理代码。在面向对象编程中,类不仅可以包含数据成员(Attributes)和成员函数(Methods),还可以与其他类建立各种关系。其中一......
  • c++学习路线
    学习C++可以按照以下路线进行:基础知识:了解C++语言的基本语法和特性学习C++的数据类型、控制流和函数熟悉面向对象编程的概念和用法类和对象:学习如何定义类和对象理解类的构造函数、析构函数和成员函数掌握类的继承、多态和封装特性STL库:熟悉STL(标准模板库)的常用容器,......
  • 计算机/网安 面试例题(七)
    安全工具1.CS工具使用渗透神器2.Nmap常用命令nmaphostname/ip或者多个ip或者子网192.168.123.*-iLip.txt扫描ip.txt的所有ip-A包含了-sV,-O,探测操作系统信息和路由跟踪。一般不用,是激烈扫描-O探测操作系统信息-sV查找主机服务版本号-sA探测该主机是否使用了包......
  • Offer必备算法15_简单多问题dp_八道力扣题(打家劫舍+买卖股票)
    目录①力扣LCR089.打家劫舍解析代码②力扣213.打家劫舍II解析代码③力扣740.删除并获得点数解析代码④力扣LCR091.粉刷房子解析代码⑤力扣309.买卖股票的最佳时机含冷冻期状态机分析解析代码⑥力扣714.买卖股票的最佳时机含手续费状态机分析解析代码⑦......
  • C++U4- 04 - 新递推2
     排列 公式 单选 组合数 单选 递推练习[直线分割平面问题]   【参考代码】#include<iostream>usingnamespacestd;inta[1010];//a[i]:第i条直线最多能将这个圆分割成的部分数intmain(){//1、定义变量n,进行输入,数组a进行存储......
  • 【力扣】268.丢失的数字
    题目描述给定一个包含[0,n]中n个数的数组nums,找出[0,n]这个范围内没有出现在数组中的那个数。示例1:输入:nums=[3,0,1]输出:2解释:n=3,因为有3个数字,所以所有的数字都在范围[0,3]内。2是丢失的数字,因为它没有出现在nums中。示例2:输入:nums=[0,......
  • C++必知必会 C++11实用特性
    文章目录前言nullptr和NULLconst和constexprauto和decltypelambda表达式function和bind右值引用移动语义move智能指针前言C++11开始添加了很多好用的新特性,个人认为想要真正掌握这些特性还是需要多读代码,多应用这些特性,本文只记录了一些个人用过的,并结合自己的使用......