Leetcode算法训练日记 | day25

一、组合总和Ⅲ

1.题目

Leetcode:第 216 题

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

2.解题思路

使用回溯算法来解决组合求和问题。backtracking 函数是一个递归函数,它尝试将每个可能的数字添加到当前路径中,并递归地继续添加下一个数字,直到路径长度达到 k 或者当前和超过目标和。每次递归调用时,都会检查当前路径长度是否满足条件以及当前和是否等于目标和,
如果满足,则将其添加到结果中。combinationSum3 函数是公共接口,它初始化结果和路径,然后开始递归过程。

3.实现代码

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

// 一、组合总和Ⅲ
class Solution1 {
public:
    vector<vector<int>> result; // 用于存储所有可能组合的结果
    vector<int> path; // 用于存储当前组合的路径

    // 递归函数,用于生成所有可能的组合
    void backtracking(int targetSum, int k, int sum, int starIndex) {
        if (path.size() == k) { // 如果当前路径长度等于 k,表示找到了一个候选组合
            if (sum == targetSum) // 如果当前组合的和等于目标和
                result.push_back(path); // 将当前路径添加到结果中
            return; // 递归返回,不再继续扩展当前路径
        }
        // 遍历从starIndex开始的数字,直到9,因为候选数字集是1到9
        for (int i = starIndex; i <= 9; i++) {
            sum += i; // 将当前数字添加到组合的当前和中
            path.push_back(i); // 将当前数字添加到路径中
            backtracking(targetSum, k, sum, i + 1);// 递归调用backtracking函数,尝试添加下一个数字
            sum -= i; // 回溯
            path.pop_back();// 回溯,移除最后一个数字,尝试其他可能的数字
            
        }
    }

    // 成员函数,用于初始化并开始组合生成过程
    vector<vector<int>> combinationSum3(int n, int k) {
        result.clear(); // 清空之前的组合结果
        path.clear(); // 清空当前路径
        backtracking(n, k, 0, 1); // 调用递归函数,从数字1开始生成组合
        return result; // 返回所有可能的组合结果
    }
};

// 二、组合总和Ⅲ(剪枝优化)
class Solution2 {
public:
    vector<vector<int>> result; // 用于存放所有满足条件的组合结果
    vector<int> path; // 用于记录当前的组合路径

    // 辅助函数,实现回溯算法的递归过程
    void backtracking(int targetSum, int k, int sum, int startIndex) {
        if (sum > targetSum) { // 如果当前和已经超过目标和,直接返回,进行剪枝
            return;
        }
        if (path.size() == k) { // 如果当前组合的长度等于 k
            if (sum == targetSum) { // 如果当前组合的和等于目标和,将其添加到结果集中
                result.push_back(path);
            }
            return; // 如果当前组合的和不等于目标和,直接返回,不进行后续递归
        }
        // 从startIndex开始,尝试所有可能的数字,直到不能再选择更多的数字
        for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
            sum += i; // 将当前数字加入到当前和中
            path.push_back(i); // 将当前数字加入到当前组合路径中
            backtracking(targetSum, k, sum, i + 1); // 递归调用,继续尝试下一个数字
            sum -= i; // 回溯,从当前和中移除最后一个数字
            path.pop_back(); // 回溯,从当前组合路径中移除最后一个数字
        }
    }


    // 成员函数,提供组合求和问题的解法
    vector<vector<int>> combinationSum3(int n, int k) {
        result.clear(); // 清空之前存储的结果集,为新的计算做准备
        path.clear(); // 清空当前的组合路径
        backtracking(n, k, 0, 1); // 调用回溯函数,从数字1开始尝试组合
        return result; // 返回所有满足条件的组合结果
    }
};


//测试
int main()
{
    Solution1 s;
    vector<vector<int>> result;
    int n, k;
    cout << "n = ";
    cin >> n;
    cout << "k = ";
    cin >> k;
    result =s.combinationSum3(n, k);
    cout << "所有的组合有:" << endl;
    for (int i = 0; i < result.size(); i++) {
        for (int j = 0; j < k; j++) {
            cout << result[i][j] << "  ";
        }
        cout << endl;
    }
    cout << endl;
    return 0;
}

ps:以上皆是本人在探索算法旅途中的浅薄见解,诚挚地希望得到各位的宝贵意见与悉心指导,若有不足或谬误之处,还请多多指教。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/542094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

标准孔板简单适应性强

即使生活一地鸡毛&#xff0c;但仍然要觉得未来可期&#xff0c;做自己而不是解释自己&#xff0c;只要能变好&#xff0c;慢点又如何&#xff0c;愿我们都是苦尽甘来的人&#xff0c;熬得住就出众&#xff0c;熬不住就出局&#xff0c;鹤壁永成矿山&#xff0c;在行业坚持十余…

tested4142

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Stacked Hourglass Networks for Human Pose Estimation 用于人体姿态估计的堆叠沙漏网络

Stacked Hourglass Networks for Human Pose Estimation 用于人体姿态估计的堆叠沙漏网络 这是一篇关于人体姿态估计的研究论文&#xff0c;标题为“Stacked Hourglass Networks for Human Pose Estimation”&#xff0c;作者是 Alejandro Newell, Kaiyu Yang, 和 Jia Deng&a…

mysql题目4

tj11&#xff1a; select count(*) 员工总人数 from tb_dept a join tb_employee b on a.deptnob.deptno where a.dname 市场部

Github 2024-04-14 php开源项目日报Top9

根据Github Trendings的统计,今日(2024-04-14统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9TypeScript项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseStar数量:30824 个Fork数量:1…

[大模型] BlueLM-7B-Chat WebDemo 部署

BlueLM-7B-Chat WebDemo 部署 模型介绍 BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;参数规模为 70 亿。BlueLM-7B 在 C-Eval 和 CMMLU 上均取得领先结果&#xff0c;对比同尺寸开源模型中具有较强的竞争力(截止11月1号)。本次发布共包含 7…

ASP.NET MVC使用Layui选择多图片上传

前言&#xff1a; 多图上传在一些特殊的需求中我们经常会遇到&#xff0c;其实多图上传的原理大家都有各自的见解。对于Layui多图上传和我之前所说的通过js获取文本框中的文件数组遍历提交的原理一样&#xff0c;只不过是Layui中的upload.render方法已经帮我们封装好了&#x…

微信跳转页面时发生报错

报错如下图所示&#xff1a; 解决方法&#xff1a;&#xff08;从下面四种跳转方式中任选一种&#xff0c;哪种能实现效果就用哪个&#xff09; 带历史回退 wx.navigateTo() //不能跳转到tabbar页面 不带历史回退 wx.redirectTo() //跳转到另一个页面wx.switchTab() //只能…

Nature Machine Intelligence 纽约大学团队提出基于深度学习和语音生成技术的脑电-语音解码

由于神经系统的缺陷导致的失语会导致严重的生活障碍&#xff0c;它可能会限制人们的职业和社交生活。近年来&#xff0c;深度学习和脑机接口&#xff08;BCI&#xff09;技术的飞速发展为开发能够帮助失语者沟通的神经语音假肢提供了可行性。开发神经-语音解码器的尝试大多数依…

【树莓派初始化】教你从0开始搭建树莓派的使用环境

文章目录 前言1.什么是树莓派&#xff1f;1.1什么用户适合购买树莓派学习编程&#xff1f; 2.如何初始化一个树莓派2.1 烧录系统2.2 测试开机2.3 设置树莓派显示输出的分辨率2.4 网络链接2.5 Putty链接树莓派2.6 VNC链接树莓派2.7 使用filezilla软件传输文件到树莓派 3.使用Xsh…

相关性气泡图-数据模拟到作图(自备)

目录 普通气泡图ggplot2 相关性气泡图 数据处理1&#xff1a;生成两个dataframe 数据处理2&#xff1a;计算相关性R和P 数据处理3&#xff1a;添加细节 绘图 核心&#xff1a;气泡的信息主要体现在气泡大小和气泡颜色变化。 普通气泡图ggplot2 rm(list ls()) librar…

【Golang学习笔记】从零开始搭建一个Web框架(三)

文章目录 分组控制分组嵌套中间件 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;二&#xff09;-CSDN博客 分组控制 分组控制(Group Control)是 Web 框架应提供…

Linux系统——Zookeeper集群

目录 一、Zookeeper概述 1.Zookeeper简介 2.Zookeeper工作机制 3.Zookeeper数据结构 4.Zookeeper应用场景 4.1统一命名服务 4.2统一配置管理 4.3统一集群管理 4.4服务器动态上下线 4.5软负载均衡 5.Zookeeper选举机制 5.1第一次启动选举机制 5.2非第一次启动选举机…

006Node.js cnpm的安装

百度搜索 cnpm,进入npmmirror 镜像站https://npmmirror.com/ cmd窗口输入 npm install -g cnpm --registryhttps://registry.npmmirror.com

ESP32系统监测(基于ESP-IDF)

主要参考资料&#xff1a; CSDN文章《ESP32 IDF开发调试奇技淫巧》: https://blog.csdn.net/qq_43332314/article/details/131859971 目录 查询系统剩余堆/最小堆大小查询线程剩余栈大小方法一方法二 查询CPU占用率 查询系统剩余堆/最小堆大小 查询系统剩余堆、最小堆大小的 A…

K8s下部署grafana

1. 系统要求 最小化的软硬件要求 最小化硬件要求 磁盘空间: 1 GB内存: 750 MiB (approx 750 MB)CPU: 250m (approx 2.5 cores) 2. k8s部署grafana步骤 1) 创建名字空间 kubectl create namespace my-grafana 2) 创建yaml vim grafana.yaml yaml包含如下三个资源对象 Ob…

AIGC 探究:人工智能生成内容的技术原理、广泛应用、创新应用、版权问题与未来挑战

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;即人工智能生成内容&#xff0c;其核心在于利用深度学习技术&#xff0c;尤其是基于神经网络的模型&#xff0c;来模拟人类创作过程&#xff0c;自主生成高质量的文本、图像、音频、视频等各类内容。神经…

test4141

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

软考高级架构师:随机函数模型

一、AI 讲解 随机函数模型是理解各种随机过程和算法的一个重要概念&#xff0c;在软件工程、算法设计以及系统分析中有着广泛的应用。简而言之&#xff0c;随机函数模型是一种用于描述具有随机性的系统或过程的数学模型&#xff0c;它能够帮助我们预测和分析在不确定性下的系统…

Day18_学点儿设计模式_MVC和三层架构

0 优质文章 MVC与三层架构 什么是MVC&#xff1f;什么是三层架构&#xff1f; 三层架构与MVC详细讲解 MVC三层架构&#xff08;详解&#xff09; 1 MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写…