组合 - 三种形式

无重不可复选,可重不可复选,无重可复选

77. 组合 - 元素无重不可复选

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

题解

组合和子集是一样的:大小为 k 的组合就是节点数目为 k 的所有子集(回溯树第K层),取子集中第K层的节点。

参考:子集 - 三种形式

public List<List<Integer>> res = new LinkedList<>(); // 记录结果
public LinkedList<Integer> track = new LinkedList<>(); // 记录路径
public List<List<Integer>> combine(int n, int k) {// 从1开始backtrack(n, k, 1);return res;
}
public void backtrack(int n, int k, int start) {// 大小为 k 的组合就是大小为 k 的子集if (track.size() == k) {// 取子集中第K层的节点,遍历到了第 k 层,收集当前节点的值res.add(new LinkedList<>(track));return;}for (int i = start; i <= n; i++) {track.add(i); // 做选择backtrack(n, k, i + 1); // 下一次回溯树track.removeLast(); // 撤销选择}
}

变种:和为n的组合

/*** 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:* 只使用数字1到9* 最多使用一次*/
public int trackSum = 0; // 记录 track路径和
public void backtrack2(int n, int k, int start) {// 大小为 k 的组合就是大小为 k 的子集if (track.size() == k) {if (trackSum == n) { // 和为 nres.add(new LinkedList<>(track));}return;}for (int i = start; i <= 9; i++) {track.add(i);trackSum += i;backtrack2(n, k, i + 1);track.removeLast();trackSum -= i;}
}

40. 组合总和 II - 元素可重不可复选

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

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

注意: 解集不能包含重复的组合。

题解

组合问题和子集问题是等价的,修改递归结束条件,使用 trackSum 记录回溯路径上的元素和,和target比较

  1. 先排序
  2. 再剪枝去重
public List<List<Integer>> res = new LinkedList<>(); // 记录结果
public LinkedList<Integer> track = new LinkedList<>(); // 记录路径
public int trackSum = 0; // 记录路径和
public List<List<Integer>> combinationSum2(int[] nums, int target) {// 先排序,让相同的元素靠在一起Arrays.sort(nums);// 开启回溯树,最初从下标0开始选择backtrack(nums, 0, target);return res;
}
public void backtrack(int[] nums, int start, int target) {// base case,达到目标和,找到符合条件的组合if (trackSum == target) {res.add(new LinkedList<>(track));// 已找到,递归终止,后面的trackSum > target,没必要再继续找了return;}// base case,超过目标和,递归终止if (trackSum > target) return;// 回溯算法标准框架for (int i = start; i < nums.length; i++) {// 剪枝if (i > start && nums[i] == nums[i - 1]) continue;track.add(nums[i]);trackSum += nums[i];// 通过 start 参数控制树枝的遍历,避免产生重复的子集backtrack(nums, i + 1, target);track.removeLast();trackSum -= nums[i];}
}

39. 组合总和 - 元素无重可复选

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

题解

是否重复使用元素, 通过start参数,控制树枝的遍历

  • start = start+1,下一层回溯树,不可以选自己(一个元素使用一次)
  • start = start,下一层回溯树,可以选自己(一个元素重复使用

设置合适的 base case 以结束算法,即路径和大于 target 结束。

public List<List<Integer>> res = new LinkedList<>(); // 记录结果
public LinkedList<Integer> track = new LinkedList<>(); // 记录回溯路径
public int trackSum = 0; // 记录 track 中的路径和
public List<List<Integer>> combinationSum(int[] nums, int target) {backtrack(nums, 0, target);return res;
}
// 回溯算法
public void backtrack(int[] nums, int start, int target) {// base case,找到目标和,记录结果,结束递归if (trackSum == target) {res.add(new LinkedList<>(track));return;}// base case,大于目标和,停止向下遍历,结束递归if (trackSum > target) {return;}// 回溯算法标准框架for (int i = start; i < nums.length; i++) {track.add(nums[i]);trackSum += nums[i];// 通过start参数,控制树枝的遍历// start = start,下一层回溯树,可以选自己(一个元素可以无限次使用)// start=start+1,下一层回溯树,不可以选自己(一个元素只使用一次)backtrack(nums, i, target);track.removeLast();trackSum -= nums[i];}
}

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

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

相关文章

【Springboot】单元测试Junit5应用

JUnit 5是一个功能强大的测试框架&#xff0c;常用于编写和执行这些单元测试。以下是一些JUnit 5中的常用注解、断言、前置条件、嵌套测试和参数化测试的例子&#xff1a; 1.环境启动 SpringBootTest 注解&#xff1a; classes SmartApplication.class&#xff1a;这个属性…

前端JavaScript篇之JavaScript有哪些内置对象

目录 JavaScript有哪些内置对象常见的内置对象的简单描述和参考代码总结 JavaScript有哪些内置对象 JavaScript中常见的内置对象包括&#xff1a; Object&#xff1a;用于创建对象的构造函数&#xff0c;对象是键值对的集合&#xff0c;用于存储和传递数据。 Array&#xff1…

【C语言】内联函数总结

内联函数定义 inline关键字是C99标准的型关键字&#xff0c;其作用是将函数展开&#xff0c;把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码&#xff0c;而不发生跳转、压栈等一般性函数操作。可以节省时间&#xff0c;也会提高程序的执行速度。 …

python计算两个DataFrame的指定两列中,相同的数据有多少

目的&#xff1a;查询数据1和数据2中&#xff0c;red与red列相同 并且blue与blue列相同的&#xff0c;情况有多少。 &#xff08;备注&#xff1a;两个数据中格式不一致&#xff0c;需要经过json提取等处理步骤&#xff09; 思路步骤&#xff1a; 1、读取数据1&#xff0c;筛选…

2024/2/3 备战蓝桥杯 4-2 排序

目录 错误票据 0错误票据 - 蓝桥云课 (lanqiao.cn) 奖学金 0奖学金 - 蓝桥云课 (lanqiao.cn) 错误票据 0错误票据 - 蓝桥云课 (lanqiao.cn) 特点&#xff1a;不知道每一行要输入的数字有多少个&#xff0c;一共要输入n行数字 可以这样写&#xff1a; for(int i 0;i &l…

蓝桥杯经典 年号字串

年号字串 【问题描述】 小明用字母 A 对应数字 1&#xff0c;B 对应 2&#xff0c;以此类推&#xff0c;用 Z 对应 26。对于 27 以上的数 字&#xff0c;小明用两位或更长位的字符串来对应&#xff0c;例如 AA 对应 27&#xff0c;AB 对应 28&#xff0c;AZ 对应 52&#xff0…

【MongoDB】跨库跨表查询(python版)

MongoDB跨表跨库查询 1.数据准备&#xff1a;2.跨集合查询3.跨库查询应该怎么做&#xff1f; 讲一个简单的例子&#xff0c;python连接mongodb做跨表跨库查询的正确姿势 1.数据准备&#xff1a; use order_db; db.createCollection("orders"); db.orders.insertMan…

秦厚荣简历

秦厚荣&#xff0c;男&#xff0c;汉族&#xff0c;1962年出生于江苏省&#xff0c;南京大学数学系教授&#xff0c;首批入选国家“百千万人才计划”&#xff0c;享受国务院特殊津贴。现为中共南京大学委员会委员、数学系党委书记&#xff0c;江苏省数学学会理事长&#xff0c;…

2021-10-12 51蛋骗鸡数码管前7位显示1-7第8位显示0-9

缘由 51单片机数码管问题-编程语言-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; bit k1,wk0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128,255,64};//0-9.消隐- unsigned char Js0,miao0,fen…

【MIT 6.S081】2020, 实验记录(5),Lab: lazy allocation

目录 Task 1: Eliminate allocation from sbrk()Task 2: Lazy allocationTask 3: Lazytests and Usertests 在学习了 page fault 这一节课后&#xff0c;了解了操作系统是如何结合 page table 和 trap 利用 page fault 来实现一系列的神奇的功能。这个 lab 就是在 XV6 中实现 l…

Java 数据类型详解与类型转换技巧

Java 数据类型 Java 中的变量必须是指定的数据类型&#xff1a; int myNum 5; // 整数 float myFloatNum 5.99f; // 浮点数 char myLetter D; // 字符 boolean myBool true; // 布尔值 String myText "Hello"; // 字符串数…

Codeforces Round 651 (Div. 2)C 博弈 奇偶数 偶数的表示

Submission #244500083 - Codeforces 题目&#xff1a; 思路&#xff1a; 此题要从奇偶性上入手。&#xff08;注意除的是奇因数&#xff0c;即一个奇数。我想成质数了&#xff09; 1.当A选手开局是1时&#xff0c;A败。 2.当A选手开局是2和奇数时&#xff0c;A必胜。&…

【Qt加密播放器】登录窗口功能补充

输入框小设计 目的&#xff1a;实现鼠标点击输入框时的聚焦效果。 首先在LoginForm构造函数中为账号和密码输入框添加事件过滤器。关于事件过滤器的具体介绍可以参考这篇博文&#xff1a;Qt消息机制和事件 ui->nameEdit->installEventFilter(this); ui->pwdEdit->…

常用换源总结

1.Ubuntu16.04更换国内源 在Ubuntu系统上使用apt-get install进行软件安装或更新的时候&#xff0c;由于使用的是国外源&#xff0c;导致下载速度很慢或者连接超时&#xff0c;需要更换下载源。 1.将系统原始的源文件进行备份 sudo cp /etc/apt/sources.list /etc/apt/source…

docker踩坑记录

踩坑记录 1.1 后台启动容器&#xff0c;实际没有启动 现象&#xff1a; 后台启动centos&#xff0c;结果执行docker ps命令&#xff0c;容器没启动。 原因&#xff1a; docker是以容器启动的&#xff0c;必须要有个前台进程&#xff0c;若是全部都是后台deamon守护进程&…

ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战

文章目录 ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战一、LangGPT是什么?二、远古诗人 vs 现代诗人三、LangGPT Role模板实战 - 甩锅王Role模板特征提取四、 用AI实现提示词结构化ChatGPT实战100例 - (12) 结构化提示词 LangGPT 实战 一、LangGPT是什么? 随着大模型…

代码随想录算法训练营第42天 | 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

目录 01背包问题&#xff0c;你该了解这些&#xff01; 01 背包 二维dp数组01背包 &#x1f4bb;实现代码 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 一维dp数组&#xff08;滚动数组&#xff09; &#x1f4bb;实现代码 416. 分割等和子集 &#x1f…

前后端数据校验

前端校验内容 前端开发中的必要校验&#xff0c;可以保证用户输入的数据的准确性、合法性和安全性。同时&#xff0c;这些校验也有助于提供良好的用户体验和防止不必要的错误提交到后端。 1、必填字段校验&#xff1a; 对于必填的字段&#xff0c;需确保用户输入了有效的数据…

二叉树可视化

二叉树可视化 运行演示代码和程序已上传二叉树知识平衡二叉树红黑树最优二叉搜索树哈夫曼树KD树B树和B树 参考 运行演示 学习二叉树总是脑补图像&#xff0c;实在是恶心&#xff0c;就想写一个能可视化的二叉树&#xff0c;结果没控制好&#xff0c;功能越想越多&#xff0c;先…

腾讯面试题

目录 1 tcp可靠性&#xff0c;然后问十六位校验和怎么实现的 2 TCP粘包 3 进程协程线程 4 跳表怎么实现 5 gostruct能不能比较&#xff1f; 6 godefer&#xff08;fordefer&#xff09; 7 go select可以用于什么&#xff1f; 8 client如何实现长连接&#xff1f; 1. …