回溯算法 -- 77. 组合

目录

一.题目描述

二.解题思路

三.回溯三部曲

3.1确定递归函数的返回值以及参数

3.2回溯算法的终止条件

3.3确定单层循环搜索逻辑

四.具体的代码


一.题目描述

给定两个整数 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]]

二.解题思路

本题为一道经典的回溯算法问题。

本题最直接的解法就是for循环的嵌套,比如当k取2时,这时大家都可以想到我们可以用两层for循环来解决这个问题

代码如下:

int n = 4;
for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {}
}

但是我们要考虑一个问题,那就是如果k = 50呢,那我们就要用50层for循环嵌套?

此时我们就要使用回溯算法来解决本题

回溯算法虽然也是一种暴力搜索的方法,但是我们可以使用递归来解决问题.

回溯法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯就容易多了

所以我们可以把本题抽象为如下树的结构:

可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。

第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。

每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。

图中可以发现n相当于树的宽度,k相当于树的深度。

那么如何在这个树上遍历,然后收集到我们要的结果集呢?

图中每次搜索到了叶子节点,我们就找到了一个结果。

相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。

三.回溯三部曲

3.1确定递归函数的返回值以及参数

 List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();

path集合 用来存放符合条件结果的集合

result集合 用来存放结果集

3.2回溯算法的终止条件

如果组合数长度达到规定的k值就可以满足条件终止'

//如果组合数长度达到规定的k值就可以满足条件终止if(path.size() == k){//将满足条件的一维数组添加到结果集中result.add(new ArrayList<>(path));return;}

3.3确定单层循环搜索逻辑

 

for循环每次从startIndex开始遍历,然后用path保存取到的节点i。

//确定单层循环搜索逻辑for (int i = startIndex; i <= n; i++) {//处理节点path.add(i);//递归函数backtracking(n,k,i+1);//回溯操作(撤销)path.removeLast();}
四.具体的代码
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;public class Solution77 {List<List<Integer>> result = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n,k,1);return result;}public void backtracking(int n , int k , int startIndex){//确定终止条件//如果组合数长度达到规定的k值就可以满足条件终止if(path.size() == k){//将满足条件的一维数组添加到结果集中result.add(new ArrayList<>(path));return;}//确定单层循环搜索逻辑for (int i = startIndex; i <= n; i++) {//处理节点path.add(i);//递归函数backtracking(n,k,i+1);//回溯操作(撤销)path.removeLast();}}public static void main(String[] args) {Solution77 solution77 = new Solution77();Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int k = scanner.nextInt();List<List<Integer>> res = new ArrayList<>();res = solution77.combine(n,k);System.out.println(res);}
}

 

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

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

相关文章

【Linux】进程间通信(System V IPC)

这节我们开始学习System V IPC方案。 分别是共享内存&#xff0c;消息队列与信号量 会着重讲解共享内存&#xff0c;但是消息队列与信号量只会说明一下原理。 原因&#xff1a;System V是新设计的一套标准 与文件的整合度不高只能进行本地通信 更何况&#xff0c;我们现在有…

若依开发-数据库修改密码

若依忘记密码 在SecurityUtils类添加 public static void main(String[] args) {System.out.println(SecurityUtils.encryptPassword("admin123"));}即可打印出加密后密码

探索安全之道 | 企业漏洞管理:从理念到行动

如今&#xff0c;网络安全已经成为了企业管理中不可或缺的一部分&#xff0c;而漏洞管理则是网络安全的重中之重。那么企业应该如何做好漏洞管理呢&#xff1f;不妨从业界标准到企业实践来一探究竟&#xff01;通过对业界标准的深入了解&#xff0c;企业可以建立起完善的漏洞管…

谷歌发布文生视频模型——Veo,可生成超过一分钟高质量1080p视频

前期我们介绍过OpenAI的文生视频大模型-Sora 模型&#xff0c;其模型一经发布&#xff0c;便得到了大家疯狂的追捧。而Google最近也发布了自己的文生视频大模型Veo&#xff0c;势必要与OpenAI进行一个正面交锋。 Veo 是Google迄今为止最强大的视频生成模型。它可以生成超过一分…

JVM虚拟机性能监控工具

命令行工具 jps 虚拟机进程状况查询工具 jps(JVM Process Status Tool)&#xff0c;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执行主类名称或者jar文件名&#xff0c;还有这些进程的本地虚拟机唯一ID(LVMID&#xff0c;Local Virtual Machine Identifier)。 # …

网页安全登陆的设计思路

对于Web网站来讲,不管是企业内容信息化系统,还是公共站点(博客、音视频站等),都有需要用户注册和登录的功能。用以识别用户、信息交互、信息隔离以及商业行为等场景。用户数据已成为网站的重要资产。保护用户信息(数据)是网站安全运行的关键任务。本文以用户安全登录的场…

521源码-网站源码-Thinkphp聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能/全开源运营版本

全开源运营版本聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能 都是去年买的&#xff0c;很多买的源码基本都下架了&#xff0c;详情还是套已经老站的&#xff0c;可能网上已经流传了点&#xff0c;不过还是不影响这个源码的牛逼所在 运营版本的聊天室&…

JVM之【运行时数据区2——堆】

三、堆&#xff08;Heap&#xff09; 1、什么是堆 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;堆&#xff08;Heap&#xff09;是用于动态分配内存的区域。在Java程序运行时&#xff0c;所有对象和数组都是在堆中分配内存的。堆是Java内存模型的重要组成部分&…

21.Redis之分布式锁

1.什么是分布式锁 在⼀个分布式的系统中, 也会涉及到多个节点访问同⼀个公共资源的情况. 此时就需要通过 锁 来做互斥控制, 避免出现类似于 "线程安全" 的问题. ⽽ java 的 synchronized 或者 C 的 std::mutex, 这样的锁都是只能在当前进程中⽣效, 在分布式的这种多…

LabVIEW调用第三方硬件DLL常见问题及开发流程

在LabVIEW中调用第三方硬件DLL时&#xff0c;除了技术问题&#xff0c;还涉及开发流程、资料获取及与厂家的沟通协调。常见问题包括函数接口不兼容、数据类型转换错误、内存管理问题、线程安全性等。解决这些问题需确保函数声明准确、数据类型匹配、正确的内存管理及线程保护。…

C/C++开发,2024.x CLion安装,亲测有效

CLion 是一款专为 C 和 C 开发者设计的跨平台集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了智能代码补全、代码分析、调试和 Git 集成等功能&#xff0c;以提高开发效率和代码质量。 1.下载安装c/c开发工具 CLion 先去官网下载&#xff0c;我这里下载的是最新版…

Re73 读论文:ULMFiT Universal Language Model Fine-tuning for Text Classification

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Universal Language Model Fine-tuning for Text Classification 模型简称&#xff1a;ULMFiT 模型全名&#xff1a;Universal Language Model Fine-tuning ArXiv网址&#xff1a;https…

【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言方法一、使用excel配置表excel转txt文本读取txt数据按配置信息生成僵尸 方法二、使用ScriptableObject 配置关卡信息源码结束语 前言 本节主要是推荐两种实现配置关卡信息&#xff0c;并按表生成僵尸和关卡波次 方法一、使用…

PCIe总线-事物层之TLP路由介绍(七)

1.概述 下图是一个PCIe总线系统示意图。此时RC发出一个TLP&#xff0c;经过Switch访问EP&#xff0c;TLP的路径为红色箭头所示。首先TLP从RC的下行OUT端口发出&#xff0c;Switch的上行IN端口接收到该TLP后&#xff0c;根据其路由信息&#xff0c;将其转发到Switch的下行OUT端…

Google力作 | Infini-attention无限长序列处理Transformer

更多文章&#xff0c;请关注微信公众号&#xff1a;NLP分享汇 原文链接&#xff1a;Google力作 | Infini-attention无限长序列处理Transformerhttps://mp.weixin.qq.com/s?__bizMzU1ODk1NDUzMw&mid2247485000&idx1&sne44a7256bcb178df0d2cc9b33c6882a1&chksm…

Linux的shell脚本:如何用bash脚本从mysql数据库中直接读取用户数据,并直接显示出来(一条命令查看数据库信息)

目录 一、要求 二、脚本和解释 三、脚本执行 1、 脚本保存为sh文件 2、给脚本赋予执行权限 3、运行脚本 四、Bash脚本中&#xff0c;可以使用哪些MySQL语句 1、连接到MySQL数据库 2、执行SQL语句 3、查询并显示结果 4、脚本中执行SQL文件 5、数据库操作 …

Vue.js 动态组件与异步组件

title: Vue.js 动态组件与异步组件 date: 2024/6/2 下午9:08:50 updated: 2024/6/2 下午9:08:50 categories: 前端开发 tags:Vue概览动态组件异步加载性能提升路由管理状态控制工具生态 第1章 Vue.js 简介 1.1 Vue.js 概述 Vue.js 是一个渐进式的JavaScript框架&#xff0c;…

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023 前言 相关个性化生成论文推荐简介问题定义方法损失函数实验结果 前言 亲身阅读感受分享&#xff0c;细节画图解释&#xff0c;再也不用担心看不懂论文啦~ 无抄袭&#xff0c;无复制&#xff0c;纯手…

中间件模版引擎

文章目录 中间件1.自定义中间件1&#xff09;全局2&#xff09;局部中间件 2.内置中间件(静态资源目录&#xff09; Art-template1.模板语法1&#xff09;输出2&#xff09;原文输出3&#xff09;条件判断4&#xff09;循环5&#xff09;子模版6&#xff09;模版继承7&#xff…

vue-Dialog 自定义title样式

展示结果 vue代码 <el-dialog :title"title" :visible.sync"classifyOpen" width"500px" :showClose"false" class"aboutDialog"> <el-form :model"classifyForm" :rules"classifyRules">…