Leetcode算法训练日记 | day25

news2024/12/28 5:31:03

一、组合总和Ⅲ

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…

数学基础:矩阵

来自: https://www.shuxuele.com/algebra/matrix-determinant.html 一、矩阵的行列式 二、矩阵简单知识 三、矩阵乘法 四、单位矩阵 五、逆矩阵一&#xff1a;简单2阶矩阵求法 六、逆矩阵二&#xff1a;3、4阶逆矩阵求法 6.1 求余子式矩阵 6.2 求代数余子式矩阵 6.3 求伴随矩阵…

练习题(2024/4/13)

1长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&am…

WebService反向代理的配置和

WebService反向代理的配置和 家都知道&#xff0c;联网上有很多被墙了的网站&#xff0c;虽然这是让人很伤心的一件事情&#xff0c;但还好咱们有办法绕过这个限制&#xff0c;那就是使用IP代理。今天我就来给大家讲讲如何配置和使用WebService反向代理。 什么是WebService反向…

【AR】使用深度API实现虚实遮挡

遮挡效果 本段描述摘自 https://developers.google.cn/ar/develop/depth 遮挡是深度API的应用之一。 遮挡&#xff08;即准确渲染虚拟物体在现实物体后面&#xff09;对于沉浸式 AR 体验至关重要。 参考下图&#xff0c;假设场景中有一个Andy&#xff0c;用户可能需要放置在包含…

整体性学习

整体性学习的顺序&#xff1a; 1.获取 2.理解&#xff08;明白&#xff09;3.拓展&#xff08;探究&#xff09;4.纠错&#xff08;调试&#xff09;5.应用 测试伴随每一个过程 例如&#xff1a; 吃饭&#xff08;去学习&#xff09;–>点菜&#xff08;学什么&#xff0c…

VRRP——虚拟路由冗余协议

什么是VRRP 虚拟路由冗余协议VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种用于提高网络可靠性的容错协议。 通过VRRP&#xff0c;可以在主机的下一跳设备出现故障时&#xff0c;及时将业务切换到备份设备&#xff0c;从而保障网络通信的连续性和可…

Excel中输入数字会改变怎么办?

一、数字显示不全&#xff0c;以“#”号代替 随着列宽的缩小&#xff0c;数字逐渐被“#”号代替&#xff08;首先数字的格式是“数值型&#xff0c;且只有整数”&#xff09; 原因分析&#xff1a;单元格中的数字无法完全显示&#xff0c;Excel会自动用“#”号填充剩余的空间 解…

【好用】推荐10套后端管理系统前端模板

后台管理系统前端模板是开发者在构建后台管理系统时使用的一种工具&#xff0c;它提供了预先设计好的界面和组件&#xff0c;以帮助开发者快速搭建出功能完善、用户体验良好的管理系统。以下是V哥整理的10款流行的后台管理系统前端模板&#xff0c;它们基于不同的技术栈和设计理…

亚马逊跨境电商崛起,武汉星起航引领新手卖家抢占全球市场

随着全球化的深入推进&#xff0c;跨境电商已成为连接世界贸易的重要桥梁。作为全球最大的电商平台之一&#xff0c;亚马逊正以其强大的物流网络和庞大的用户基础&#xff0c;引领跨境电商业务迅速崛起。业内专家分析指出&#xff0c;亚马逊跨境电商市场有望在未来几年内继续保…

机器学习—数据集(二)

1可用数据集 公司内部 eg:百度 数据接口 花钱 数据集 学习阶段可用的数据集&#xff1a; sklearn:数据量小&#xff0c;方便学习kaggle&#xff1a;80万科学数据&#xff0c;真实数据&#xff0c;数据量大UCI&#xff1a;收录了360个数据集&#xff0c;覆盖科学、生活、经济等…

A Learning-Based Approach for IP Geolocation(2010年)

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:185 Eriksson B, Barford P, Sommers J, et al. A learning-based approach for IP geolocation[C]//Passive …

C++---vector容器

是STL容器中的一种常用的容器&#xff0c;由于其大小(size)可变&#xff0c;常用于数组大小不可知的情况下来替代数组。vector容器与数组十分相似&#xff0c;被称为动态数组。时间复杂度为O&#xff08;1&#xff09;。 数组数据通常存储在栈中&#xff0c;vector数据通常存储…

算数逻辑单元

目录 一、王道考研ppt总结 二、个人理解 一、王道考研ppt总结 二、个人理解 74181是一款经典的ALU 可以进行加减乘除和与或非、异或等计算&#xff1b;还有移位和求补等 输入有一个CU信号&#xff0c;即控制单元信号&#xff0c;有一个M信号&#xff0c;当M为1时&#xff0c;进…

VBOX ubuntu20.04 安装好后无法启动 terminal 是什么原因?

这种情况通常是 字符问题 先点开 Settings ----> Region & Language , 如下 把系统的语言和地区设置成一致的 再参考这里 https://blog.csdn.net/u010092716/article/details/130968032 再参考这里 https://blog.csdn.net/pxy7896/article/details/135216651 然后重…

记录Ubuntu 20.04中被困扰半年多之久的疑难的解决

一、我的ubuntu20.04症状描述&#xff1a; 在编辑文字文档的过程中&#xff0c;会不定时的出现鼠标指针随意跳动的情形&#xff0c;严重干扰了做文字编辑、编写代码等工作的进行。先后排除了戴尔笔记本及配件故障、鼠标故障、ubuntu系统中文档编辑软件的故障等可能。 二、原来…

初识ansible服务及ansible主机清单配置

目录 1、什么是自动化批量管理 2、自动化工具ansible架构 3、ansible服务专用术语对照表 4、设置主机清单&#xff08;inventory&#xff09; 3.1实验环境准备 3.2配置主机清单 3.2.1分组基本格式 3.2.2指定用户名&#xff0c;密码。端口 3.2.3子组 3.3查看 3.3.1看…

数据同步工具datax配置与示例

文章目录 前言一、部署步骤1、jdk环境2、python环境步骤一&#xff1a;安装方式一&#xff1a;官网下载安装包方式二&#xff1a;brew命令安装 步骤二&#xff1a;配置环境变量步骤三&#xff1a;验证 3、maven环境&#xff08;可选&#xff09; 二、下载安装datax1、下载datax…

LeetCode 二十一:合并两个有序链表 【python】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作http://t.csdnimg.cn/Q59WX作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打…

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址&#xff1a;Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…