当前位置: 首页 > news >正文

算法-回溯算法-组合问题

77. 组合https://leetcode.cn/problems/combinations/

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

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

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]
class Solution {List<List<Integer>> ans=new ArrayList<>();List<Integer> path=new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return ans;}//start来记录下⼀层递归,搜索的起始位置。private void backtracking(int n,int k,int start){//遍历终止条件if(path.size()==k){ans.add(new ArrayList<>(path));return;}/**已经选择的元素path.size()还需要选择的元素k-path.size()*/for(int i=start;i<=n-(k-path.size())+1;i++){path.add(i);backtracking(n,k,i+1);path.remove(path.size()-1);}}
}

216. 组合总和 IIIhttps://leetcode.cn/problems/combination-sum-iii/description/

找出所有相加之和为 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
没有其他符合的组合了。

 

class Solution {List<List<Integer>> ans = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum =0;public List<List<Integer>> combinationSum3(int k, int n) {backtracking(k,n,1);return ans;}start来记录下⼀层递归,搜索的起始位置。private void backtracking(int k,int n,int start){//终止条件;组合大小=k或者和大于nif(path.size()==k||sum>n){if(sum==n){ans.add(new ArrayList<>(path));}return;}for(int i=start;i<=9-(k-path.size())+1;i++){path.add(i);sum+=i;backtracking(k,n,i+1);sum-=i;path.remove(path.size()-1);}}
}

 39. 组合总和https://leetcode.cn/problems/combination-sum/description/

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

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

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

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

 示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
class Solution {List<List<Integer>> ans = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum=0;public List<List<Integer>> combinationSum(int[] candidates, int target) {//排序是为了剪枝,如果加上当前元素已经大于target,那么就没有必要继续遍历下去Arrays.sort(candidates);backTracking(candidates, target, 0);return ans;}//start记录每层遍历的起始位置,元素可以无限制重复使用,因此start不需要变更private void backTracking(int[] candidates, int target, int start) {if (sum == target) {ans.add(new ArrayList<>(path));return;}for (int i = start; i < candidates.length; i++) {//当前元素大于target终止遍历if(candidates[i]>target){break;}//元素之和大于target终止遍历if(sum+candidates[i]>target){continue;}sum += candidates[i];path.add(candidates[i]);backTracking(candidates, target, i);path.remove(path.size()-1);sum -= candidates[i];}}
}

40. 组合总和 IIhttps://leetcode.cn/problems/combination-sum-ii/description/

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

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

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

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

 示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]
class Solution {List<List<Integer>> ans = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum=0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {//记录每个元素使用boolean[] used = new boolean[candidates.length];Arrays.sort(candidates);backTracking(candidates, target,used, 0);return ans;}private void backTracking(int[] candidates, int target,boolean[] used,int start) {if (sum == target) {ans.add(new ArrayList<>(path));return;}for (int i = start; i < candidates.length && sum + candidates[i] <= target; i++) {//同层相同元素已经使用过则跳过if (i > 0 && candidates[i - 1] == candidates[i] && used[i - 1]==false) {continue;}used[i] = true;sum += candidates[i];path.add(candidates[i]);backTracking( candidates, target,used,i+1);path.remove(path.size()-1);sum -= candidates[i];used[i] = false;}}
}

相关文章:

算法-回溯算法-组合问题

77. 组合https://leetcode.cn/problems/combinations/ 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,…...

ABAP中的Null值与space 以及 BW中ADSO的Key值

写出来怪丢人&#xff0c;到现在还没搞懂这个。 在BW中创建ADSO&#xff0c;定义Key字段。可以看到ADSO表的定义中&#xff0c;所有的Key和Data属性如下&#xff1a; 所有的key会有关键字key打头&#xff0c;所有字段都有not null. 但是并不是有个字段是blank空的就不能更新进…...

JavaScript库之Lodash常用方法

Lodash 中文文档https://www.lodashjs.com/docs/lodash.omit/以下总结了在项目中常用的方法&#xff0c;其他的慢慢更新语言&#xff1a;cloneDeep这个方法类似_.clone&#xff0c;除了它会递归拷贝 value。&#xff08;注&#xff1a;也叫深拷贝&#xff09;参数value (*): 要…...

Kotlin新手教程二(Kotlin基本数据类型及基础语法)

一、基本数据类型 1.数字 由于Kotlin支持类型推断&#xff0c;所以在使用时若超出Int的范围则会被认定为其它类型&#xff1b;若需要显式指定Long型值&#xff0c;则需要在值后添加L后缀。 2.浮点数 3.比较两个数&#xff08; 和 &#xff09; Kotlin 中没有基础数据类型&a…...

git idea创建新分支,获取/合并主支代码的2个方法

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 个人目录 获取主支代码的2个方法1&#xff0c;创建一个分支&#xff0c;获取主支的所有代码&#xff08;场景&#xff1a;我需要一个自己的分支进行编写模…...

CF1714A Everyone Loves to Sleep 题解

CF1714A Everyone Loves to Sleep 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例解释题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1代码实现题目 链接 https://www.luogu.com.cn/problem/CF1714A 字面描述 题面翻译 题目描述 Vlad和其他人一样&am…...

oracle官方下载历史版本JDK版本

背景 日常工作中由于一些特殊原因&#xff0c;我们需要下载指定系统指定位数指定版本的jdk&#xff0c;这个时候去网上搜索下载就会遇到各种坑&#xff0c;病毒、诱导连接、诱导关注/注册、付费、错误版本等&#xff0c;所以最好的办法是去官网下载&#xff0c;下面列举两种方式…...

双击-jar包无法运行解决方法

我自己是通过探索出来的方法解决的&#xff0c;网上的方法适合普通问题 网络流传方法 那种-jar和run.bat的就是曲解了问题意思&#xff0c;问题不是如何运行&#xff0c;而是如何双击jar包就可以直接运行。 普通小问题就是修改注册表&#xff0c;将java路径写进去后面加个 %1…...

程序员的自我修养第七章——动态链接 (下)

接上一篇。 7.3 地址无关代码 对于现代机器来说&#xff0c;引入地址无关代码并不麻烦&#xff0c;我们展示下各种模型的地址引用方式&#xff1a; 1. 模块内部函数调用 2. 模块内部的数据访问&#xff0c;如全局变量、静态变量。 3. 模块外部的函数调用&#xff0c;跳转。 4.…...

蓝桥杯刷题——基础篇(二)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…...

PTA L1-049 天梯赛座位分配(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 天梯赛每年有大量参赛队员&#xff0c;要保证同一所学校的所有队员都不能相邻&#xff0c;分配座位就成为一件比较麻烦的事情。为此我们制定如下策…...

Linux部分参数作用讲解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

Java kafka

JAVA面试题--Kafka&#xff08;最新最全&#xff09; 目录概述需求&#xff1a;设计思路实现思路分析1.URL管理2.网页下载器3.爬虫调度器4.网页解析器5.数据处理器拓展实现性能参数测试&#xff1a;参考资料和推荐阅读)Survive by day and develop by night. talk for import b…...

DBA之路---Stream数据共享同步机制与配置方法

oracle的Stream解析–数据共享 在g版本常用&#xff0c;如果是c版本项目一般都会选择goldengate&#xff0c;比stream靠谱多了 Oracle中的stream是消息队列一种应用形式&#xff0c;原理如下&#xff1a; 收集oracle中的事件&#xff0c;将事件保存在队列里&#xff0c;然后将…...

CF1790E Vlad and a Pair of Numbers 题解

CF1790E Vlad and a Pair of Numbers 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1790E 字面描述 题面翻译 共有 ttt 组数据。 每组数据你会得到一个正整数 xxx&…...

漏洞预警|Apache Kafka Connect JNDI注入漏洞

棱镜七彩安全预警 近日网上有关于开源项目Apache Kafka Connect JNDI注入漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 Karaf是Apache旗下的一个开…...

企业小程序开发步骤【教你创建小程序】

随着移动互联网的兴起&#xff0c;微信已经成为了很多企业和商家必备的平台&#xff0c;而其中&#xff0c;微信小程序是一个非常重要的工具。本文将为大家介绍小程序开发步骤&#xff0c;教你创建小程序。 步骤一、注册小程序账号 先准备一个小程序账号&#xff0c;在微信公…...

刚性电路板的特点及与柔性电路板的区别

打开市场上的任何一个电子产品&#xff0c;会发现里面都有一块或多块电路板。电路板是电子产品运行的核心&#xff0c;之前沐渥小编已经给大家介绍了柔性电路板&#xff0c;下面给大家介绍刚性电路板的基础知识。 刚性电路板俗称硬板&#xff0c;是由不容易变形的刚性基材制成的…...

扫码过磅+车牌识别,内蒙古蒙维过磅实现信息化管理

扫码过磅、车牌识别、对接SAP ERP系统设计思路&#xff1a; 无人值守系统升级改造包括车牌自动识别系统、信息化&#xff08;扫码等方式&#xff09;管理系统、智能自动控制系统等实现信息无纸化传递。远程监管地点设于公司东磅房&#xff0c;可以实现远程监测监控画面、称重过…...

蒙特卡洛计算圆周率

使用MC计算圆周率的小例子&#xff0c;使用python的numpy&#xff0c;matplotlib库import numpy as npimport matplotlib.pyplot as pltdef mc_calculate_pi(t):np.random.seed(t)rand_num np.random.rand(t)rand_num2 np.random.rand(t)l1 rand_num-0.5l2 rand_num2-0.5l0…...

词源探秘|从orient到panorama:解码英语单词背后的文明密码

1. 从日出东方到现代导航&#xff1a;ori词根的文明之旅 当古人第一次观察到太阳从东方升起时&#xff0c;拉丁语用"oriri"&#xff08;升起&#xff09;记录这个现象。这个词根演变为ori&#xff0c;像一条暗线贯穿人类文明&#xff1a; orient&#xff08;东方&a…...

ChatterUI本地模式深度解析:在移动设备上运行LLM的完整指南

ChatterUI本地模式深度解析&#xff1a;在移动设备上运行LLM的完整指南 【免费下载链接】ChatterUI Simple frontend for LLMs built in react-native. 项目地址: https://gitcode.com/gh_mirrors/ch/ChatterUI ChatterUI是一款基于React Native构建的轻量级LLM前端应用…...

协作边缘AI与联邦学习如何重塑去中心化能源系统

1. 项目概述&#xff1a;当边缘智能遇见分布式能源如果你和我一样&#xff0c;在能源或者物联网行业摸爬滚打多年&#xff0c;就会深刻感受到一个趋势&#xff1a;能源系统的“大脑”正在从云端下沉&#xff0c;从中心走向边缘。过去&#xff0c;我们习惯于将海量的传感器数据—…...

从“能用”到“好用”:手把手教你用Grafana打造高颜值监控Dashboard(调试实战)

从“能用”到“好用”&#xff1a;手把手教你用Grafana打造高颜值监控Dashboard&#xff08;调试实战&#xff09; 在数据驱动的时代&#xff0c;监控Dashboard不仅是技术工具&#xff0c;更是团队沟通的语言。一个优秀的Grafana面板应当像精心设计的用户界面——数据清晰呈现&…...

【C++ -Day7】封装实战 | 用类封装日志、配置和文件操作模块

引言 封装是面向对象三大特性&#xff08;封装、继承、多态&#xff09;中最基础也最重要的一环。在嵌入式开发中&#xff0c;代码的安全性、可维护性和可复用性直接决定了项目的成败。通过封装&#xff0c;我们可以将数据和操作隐藏在类内部&#xff0c;只暴露简洁的接口&…...

ARM Trace单元架构与TRCVICTLR寄存器详解

1. ARM Trace单元架构概述在嵌入式系统开发领域&#xff0c;调试能力往往决定了问题定位的效率和质量。ARM架构提供的Trace单元&#xff08;Embedded Trace Macrocell, ETM&#xff09;作为处理器指令执行流追踪的核心组件&#xff0c;已经成为现代SoC调试基础设施的重要组成部…...

微信聊天记录永久保存与深度分析:你的数字记忆守护者

微信聊天记录永久保存与深度分析&#xff1a;你的数字记忆守护者 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChat…...

有一种同事,领导再信任也要小心提防

◆你好。 职场上有这么一类人&#xff0c;他们精于伪装&#xff0c;表面上能力出众、忠心耿耿&#xff0c;实则暗地里拉帮结派、打压异己&#xff0c;甚至一步步架空领导。 这种人最可怕的地方在于&#xff0c;他们往往深得领导信任&#xff0c;成为团队里的"红人"。…...

Arm CoreSight SoC-400 CTI架构与调试技术详解

1. Arm CoreSight SoC-400 CTI架构概述在复杂的多核SoC开发过程中&#xff0c;高效的调试机制是确保系统可靠性的关键。Arm CoreSight架构中的Cross Trigger Interface&#xff08;CTI&#xff09;模块作为硬件级调试基础设施&#xff0c;实现了处理器核之间的精确事件同步。So…...

AI编程工具实战指南:从Claude Code到Cursor的深度技巧与工作流设计

1. 项目概述&#xff1a;一份写给实干派开发者的AI编程工具实战手册 如果你和我一样&#xff0c;是个在一线写代码写了十来年的老程序员&#xff0c;那你肯定已经感受到了&#xff0c;这两年AI编程工具的出现&#xff0c;彻底改变了我们写代码的方式。从最开始GitHub Copilot那…...