leetcode关于“组合“的题目合集

leetcode第77题python版组合_回溯法 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 阅读详情

最近做leetcode每日一题,连续三四天都做到一个主题,叫做“组合”,核心算法思想是 回溯法,跟子集、子集II、全排列、路径规划等思想较为相似,这里做一个记录。

77. 组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

39.组合总数
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:

输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
提示:candidate 中的每个元素都是独一无二的。

40.组合总数II

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]

216 组合总数III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

这几道题的核心思想都是回溯+剪枝,对这几道题做一个归纳,大概如下:

77.组合

数组无重复数字,规定每个组合的元素个数为k。
直接进行深搜+边界剪枝即可。

class Solution {
public:
    vector<int> temp;
    vector<vector<int>> ans;

    void dfs(int cur, int n, int k) {
        // 剪枝:temp 长度加上区间 [cur, n] 的长度小于 k,不可能构造出长度为 k 的 temp
        if (temp.size() + (n - cur + 1) < k) {
            return;
        }
        // 记录合法的答案
        if (temp.size() == k) {
            ans.push_back(temp);
            return;
        }
        /* 这种写法也可以,下面采用循环,不过需要注意循环起点不能是0,因为这里不是求全排列,而就是单纯选取当前的数
        // 考虑选择当前位置
        temp.push_back(cur);
        dfs(cur + 1, n, k);
        temp.pop_back();
        // 考虑不选择当前位置
        dfs(cur + 1, n, k);
        */
        for(int i = cur; i <= n; ++i){
            temp.push_back(i);
            dfs(i + 1, n, k);
            temp.pop_back();
        }
    }

    vector<vector<int>> combine(int n, int k) {
        dfs(1, n, k);
        return ans;
    }
};

39.组合总数

每个数字可以任意选取,数组中无重复元素。
同样由于无重复元素,故直接深搜即可。
dfs(candidates, i, target, cursum + candidates[i]);
这里不需要i + 1,因为每个数字可任意选取。

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        if(candidates.size() <= 0){
            return res;
        }
        dfs(candidates, 0, target, 0);
        return res;
    }
    void dfs(vector<int>& candidates, int begin, int target, int cursum){
        if(target == cursum){
            res.emplace_back(temp);
            return;
        }
        for(int i = begin; i < candidates.size(); ++i){
            if(cursum + candidates[i] <= target){
                temp.emplace_back(candidates[i]);
                //注意这里不是i + 1,因为每个元素可以被重复利用*
                dfs(candidates, i, target, cursum + candidates[i]);
                temp.pop_back();
            }
        }
    }
private:
    vector<vector<int>> res;
    vector<int> temp;
};

40.组合总数II

每个数字只能使用一次,解集不能包含重复的组合。
为了避免重复,首先我们可以先对源数组排序,排序的目的就是为了避免紧挨着两个相同的元素(nums[i]和nums[i-1])被重复使用,然后当前使用过的元素下一次就不能再次使用。

class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        if(candidates.size() <= 0){
            return res;
        }
        sort(candidates.begin(), candidates.end());
        dfs(candidates, 0, 0, target);
        return res;
    }
    void dfs(vector<int>& nums, int begin, int cursum, int target){
        if(cursum == target){
            res.emplace_back(temp);
            return;
        }
        for(int i = begin; i < nums.size(); ++i){
            //由于事先排序好了,这里直接去重即可。
            if(cursum + nums[i] <= target){
                if(i > begin && nums[i] == nums[i - 1]){
                    continue;
                }
                temp.emplace_back(nums[i]);
                dfs(nums, i + 1, cursum + nums[i], target);
                temp.pop_back();
            }
        }
    }
private:
    vector<vector<int>> res;
    vector<int> temp;
};

216.组合总数III

相加和为 n 的 k 个数,只允许包含 1~9,解集不能重复
其实也是一样的,这个更简单一些,对于每个当前数字而言,下一个数字可以选择当前数字之后的数字,也不需要排序了,并且源数组直接就是1~9,在1 - 9进行选择即可。

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        if(k <= 0){
            return vector<vector<int>>();
        }
        // 1. 不能存在重复的数
        dfs(1, 0, n, k);
        return res;
    }
    void dfs(int begin, int cursum, int n, int k){
        if(cursum >= n && temp.size() == k){
            if(n == cursum){
                res.emplace_back(temp);
            }
            return;
        }
        //题目说元素只能是1~9, 所以可以不需要nums, 直接循环
        for(int i = begin; i < 10; ++i){ //从begin开始, 一直往后搜索,直到满足退出条件。
            if(cursum + i <= n){
                temp.emplace_back(i);
                dfs(i + 1, cursum + i, n, k);
                temp.pop_back(); //回溯
            }
        }
    }
private:
    vector<vector<int>> res;
    vector<int> temp;
};
数据开放最全sql面试合集(leetcode) 数据分析,数据开发常见sql面试题合集,大厂常见sql面试题,连续登录,TopN等常见面试题 阅读详情

相关推荐

【力扣高频题】017.电话号码的字符组合

【力扣高频题】017.电话号码的字符组合

weixin_46879314的博客 1254

LeetCode - 组合

题目链接:https://leetcode-cn.com/problems/combinations/ 题目描述 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 我的思路 继续死磕递归; 一看到这种求各种排列组合的问题...

良晨的技术站 295

晶圆测试厂wafer map管理建议

按照Recipe设定bin定义 应有版本管理概念,一般使用最新版本做为活动版本即可 Bin明细中应包含 BinID、BinCode、BinName、BinType、BinColor、Description BinID可使用数字类型 BinCode可参照实际机台的Bin,用于匹配 有些公司也将BinID、BinCode理解为SBin和HBin 即 Software Bin & Hardware Bin 一般也将BinID对应到客户的Bin BinType

凯神做开发 1万+

Leetcode(77)——组合

Leetcode(77)——组合

KCDCY的博客 893

手把手教你搞定国民技术N32G031的Keil开发环境(附Pack包和JLink配置)

本文详细指导如何搭建国民技术N32G031的Keil开发环境,包括Keil MDK安装与激活、Pack包导入、JLink调试器配置等关键步骤。特别针对新手常见问题提供解决方案,帮助开发者快速上手N32G031系列MCU的开发工作。

cuangu9341的博客 419

人脸关键点定义汇总

前几天看一份代码临时需要找49个人脸关键点位置定义的图片发现怎么百度都搜不到,最后幸好谷歌可以使用了就用谷歌搜到了。所以在这里汇总一下我所知道的人脸关键点的定义和相关的一点东西,以备不时之需。 68个关键点 最常用的工具是Dlib,网址:http://dlib.net/ dlib的68个特征点检测算法是ERT算法【1】 使用dlib检测68个特征点的python示例见:http://dlib.n...

程序媛 7641

经典的回溯算法题leetcode组合问题整理及思路代码详解

倘若各位不太清楚回溯算法可以去看我上一篇文章。

xiaoliii0401的博客 1829

SAP FICO - 外币交易实战:汇率类型配置与货币换算率管理

月底关账前的外币评估就像财务人的"期末考",OB59配置就是你的备考方案。最低值原则(Lowest value principle)最保守。它会比较原始汇率与评估日汇率,取不利方向确认损失。适合风险厌恶型企业,我在制造业客户中应用最多。重估法(Revalue only)更反映市场现状。无论盈亏都按最新汇率调整,适合交易性金融资产处理。有个基金公司客户就靠这个方法及时反映了外汇波动收益。最小差异金额(Minimum difference)是防骚扰设置。

weixin_42524708的博客 355

leetcode 排列组合系列

排列组合是回溯算法的经典问题,有固定的模板写法,包括重复元素以及非重复元素。下面总结一下leetcode中的排列组合问题。 排列 排列问题一般是对原数组进行交换,然后维护一个全局变量的结果集合,每当符合要求将当前状态下的原数组加入到结果集合之中。 题目: 46 全排列 vector<vector<int>> res; vector<vector<int>> permute(vector<int>& nums) {

qq_33185750的博客 1858

从时序博弈到数据稳定:CS1237驱动中的信号滤波与卡尔曼实践

本文探讨了CS1237高精度ADC驱动在复杂工业环境中的信号处理挑战,重点介绍了一阶滤波与自适应卡尔曼滤波算法的实践应用。通过参数优化和动态调整策略,有效提升了数据稳定性和抗干扰能力,为嵌入式系统在噪声环境下的精密测量提供了可靠解决方案。

rnn9storyteller的博客 862

STM32CubeMX+FreeRTOS+CAN总线+传感器实战:多任务系统与通信融合开发详解

本文详细介绍了基于STM32CubeMX和FreeRTOS的CAN总线与光电传感器融合开发实战。通过多任务系统设计,实现传感器数据采集与CAN通信的协同工作,提供完整的配置例程和调试技巧,适用于工业控制与机器人感知等应用场景。

n2o3p4的博客 734

珍宝鸭的力扣练习(7):分治法题目合集

题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 ================================= 分治法解题思路: 定义基本情况。 将问题分解为子问题并递归地解决它们。 合并子问...

qq_38138689的博客 560

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 461

leetcode——回溯算法题目合集

回溯算法简介 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法...

盛夏与微风 1339

工程伦理ppt

工程伦理学 第一章 工程与伦理 1.1 如何理解工程 一、技术与工程的区别 二、技术与工程的联系 三、工程的定义 五、工程具有不确定性和探索性 六、理解工程活动的7个维度 1.2 如何理解伦理 一、道德与伦理 二、不同的伦理立场 三、伦理困境与伦理选择 1.3 工程实践中的伦理问题 一、工程活动中的行动者网络(具有动态性和网络性) 二、主要的工程伦理问题 三、工程伦理问题的特点 1.4 如何处理工程实践中的伦理问题 一、工程实践中伦理问题的辨识 二、处理工程伦理问题的基本原则 三、应对工程伦理问题的基本思路

weixin_51656605的博客 7万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Leetcode 动态规划题目合集】

选择与剪枝:明确每层的选择列表,通过排序或条件判断剪枝。路径管理:path.push_back() 和 path.pop_back() 对称操作。终止条件:根据问题设定结束条件(如路径长度、剩余目标值)。去重处理:排序后跳过同层重复元素(i > start && nums[i] == nums[i-1])。

lbj12345678_的博客 2092

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode SQL 题目合集-1

INNER JOIN:只返回两表都有匹配的记录LEFT JOIN:保留左表所有记录,右表无匹配时字段为 NULLRIGHT JOIN:保留右表所有记录,左表无匹配时字段为 NULL:返回两表所有记录。

weixin_45894621的博客 1069

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Leetcode LCP 题目集合(easy)

Leetcode Lcp 合集 LCP 17: 有序机器人 题目描述: 小扣在秋日市集发现了一款速算机器人。店家对机器人说出两个数字(记作 x 和 y),请小扣说出计算指令: “A” 运算:使 x = 2 * x + y; “B” 运算:使 y = 2 * y + x。 在本次游戏中,店家说出的数字为 x = 1 和 y = 0,小扣说出的计算指令记作仅由大写字母 A、B 组成的字符串 s,字符串中字符的顺序表示计算顺序,请返回最终 x 与 y 的和为多少。 示例 1: 输入:s = “AB

Jackshijin的博客 1628

「力扣算法合集」

冲刺力扣,加油!

qq_45992664的博客 844

LeetCode小白入门——简单题目八题合集,每题两解

本文共包括八个题目,来源于LeetCode简单难度,每个问题会给出两种解法,第一种偏暴力、易理解一些,第二种会更加高效一些,尽可能会避免利用Python的内置函数,便于真正理解算法原理。 来源:LeetCode(力扣) 链接:https://leetcode-cn.com/problemset/all/?difficulty=%E7%AE%80%E5%8D%95 1.两数之和 题目描述:给定一...

weixin_43434202的博客 3072

【忍者算法】字母组合“杀手锏“:5分钟攻克电话号码的字母组合|LeetCode 17

选择:append当前字母探索:递归处理下一个数字撤销:删除当前字母作者:忍者算法公众号:忍者算法🎁 回复【刷题清单】获取LeetCode高频面试题合集🧑‍💻 回复【代码】获取多语言完整题解💡 回复【加群】加入算法交流群,一起进步#算法面试 #LeetCode #回溯算法 #编程进阶。

忍者算法的博客 1202

20210325:力扣递归,回溯类型题目合集

力扣递归,回溯类型题目合集题目思路与算法代码实现写在最后 题目 子集 2. 90. 子集 II 3. 40. 组合总和 II 4. 22. 括号生成 思路与算法 子集:注释的很详细,递归生成子集。还有一种位运算的方法更加简洁,但是如果不熟练的话会比较吃力。 子集 II: 其余思路同上题,总体不同在于通过排序去除乱序相同的子集,再通过set去重即可。 组合总和 II:还是在上一题的基础上,继续增加条件,在递归获取所有子集的同时,利用题目要求的target进行剪枝。

Mr IMMUNIZE的博客 473

LeetCode-究极刷题【合集】

LeetCode刷题

violet的博客 1265

【LeetCode】题解合集(JavaScript版)

LeetCode题解合集

公众号:前端充电宝 2964

力扣——回溯合集

文章目录1. 所有子集2. 子集 II3. 含有 k 个元素的组合4. 组合总和5. 组合总和 II6. 没有重复元素集合的全排列7. 含有重复元素集合的全排列 1. 所有子集 题目:给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 题解:求子集,且互不相同,每次dfs可以选择取当前数字取还是不取,当执行到最后一个元素时,答案终止。 class Solution { List<List<

qq_44074143的博客 479

leetcode之palindrome-partitioning(求所有是回文数的子字符串组合的合集)

leetcode之palindrome-partitioning 题目 Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s =“a...

此心光明,亦复何言~ 256
上一篇: VS2017网络编程中bind冲突问题
下一篇: 基于C++写一个mysql连接池
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值