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

组合_回溯法_java

组合

leetcode链接

问题描述

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

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

提示:

1 <= n <= 20
1 <= k <= n

示例

示例 1:

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

输入:n = 1, k = 1
输出:[[1]]

解题思路

这是一道组合问题。第一眼看过去我们就能想到使用蛮力法,采用n重for循环。但细想后会发现n是一个变量我们无法真的将所有的for循环写出来。所以本题的正确解法是采用递归的回溯法。同时根据题目的约束条件进行优化剪枝操作。

代码实现

class Solution {//使用类内属性,减少递归过程中的空间消耗List<List<Integer>> result = new ArrayList();List<Integer> path = new LinkedList();public List<List<Integer>> combine(int n, int k) {tryCombine(1, n, k);return result;}//start...end为集合中可选元素,size为所需子集大小public void tryCombine(int start, int end, int size) {if (path.size() == size) {//若取到叶子结点将满足要求的子集加入结果集中result.add(new ArrayList(path));return;}//进行剪枝操作,该层循环可取的元素值不能大于end - (size - path.size()) + 1, 其中size - path.size()为还需取的元素个数。 //否则最终集合中没有足够的元素使子集达到size大小for (int i = start; i <= end - (size - path.size()) + 1; i++) {//拓展一个结点path.add(i);tryCombine(i + 1, end, size);//回溯,回到父结点从而拓展新的子结点path.removeLast();}}}

相关文章:

  • 【数据集】MSWEP(多源加权集合降水)再分析数据
  • 大模型交互-超拟人合成
  • 【算法可视化】模拟算法专题
  • Python接口自动化测试框架运行原理及流程
  • 【leetcode】随机链表的复制
  • Nginx使用—基础应用
  • 图像处理与视觉感知---期末复习重点(1)
  • 如何在Spring Boot框架中打印响应的日志?
  • 【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)
  • js如何渲染页面
  • [渗透教程]-024-Hashcat密码破解
  • LLM(十一)| Claude 3:Anthropic发布最新超越GPT-4大模型
  • Python 开发图形界面程序
  • 二十五、剖析HashMap
  • 《javascript高级程序设计》学习笔记 | 23.JSON
  • 【Amaple教程】5. 插件
  • Java面向对象及其三大特征
  • jquery ajax学习笔记
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Nodejs和JavaWeb协助开发
  • Solarized Scheme
  • Sublime Text 2/3 绑定Eclipse快捷键
  • TCP拥塞控制
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 记录一下第一次使用npm
  • 蓝海存储开关机注意事项总结
  • 利用DataURL技术在网页上显示图片
  • 前端面试之闭包
  • 深入浅出webpack学习(1)--核心概念
  • 因为阿里,他们成了“杭漂”
  • ​​​​​​​​​​​​​​Γ函数
  • ​Java并发新构件之Exchanger
  • #QT(串口助手-界面)
  • (2)MFC+openGL单文档框架glFrame
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (zt)最盛行的警世狂言(爆笑)
  • (多级缓存)多级缓存
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四) 虚拟摄像头vivi体验
  • (新)网络工程师考点串讲与真题详解
  • (一)appium-desktop定位元素原理
  • (原創) 未来三学期想要修的课 (日記)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转载)hibernate缓存
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • . Flume面试题
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net CHARTING图表控件下载地址
  • .NET Core中的去虚
  • .NET Framework杂记
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET单元测试
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)