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

Leetcode77:组合问题

void backtrack(参数列表) {if (终止条件) {收集结果;return;}for (选择范围内的选项) {做出选择;backtrack(新参数);  // 递归撤销选择;  // 回溯,恢复状态}
}

LeetCode 77题(组合)要求从1到n中选择k个数字的所有可能组合,且组合中的元素不能重复,顺序不影响组合的唯一性(例如[1,2]和[2,1]视为同一个组合)。

这是一个典型的组合问题,适合用回溯算法解决。

解题思路解析

  1. 回溯算法框架

    • 选择:从1到n中选择一个数字
    • 约束:每个数字只能选一次,且组合中数字递增(避免重复)
    • 目标:选出k个数字
  2. 关键优化

    • 通过start参数控制每次选择的起始位置,确保组合中的数字递增,避免产生重复组合
    • 剪枝操作:计算i的上限为n - (k - path.size()) + 1,减少不必要的循环
  3. 时间复杂度

    • 生成了C(n,k)个组合,每个组合需要O(k)的时间复制到结果中
    • 总体时间复杂度为O(C(n,k) × k)
import java.util.ArrayList;
import java.util.List;public class Combinations {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> result = new ArrayList<>();// 处理边界情况if (n < k || k <= 0) {return result;}// 调用回溯函数backtrack(n, k, 1, new ArrayList<>(), result);return result;}/*** 回溯函数* @param n 范围上限* @param k 需要选择的数字个数* @param start 起始数字(用于避免重复组合)* @param path 当前路径(已选择的数字)* @param result 结果集合*/private void backtrack(int n, int k, int start, List<Integer> path, List<List<Integer>> result) {// 终止条件:已选择k个数字if (path.size() == k) {result.add(new ArrayList<>(path));return;}// 遍历可能的选择// 剪枝优化:i的上限可以计算为n - (k - path.size()) + 1for (int i = start; i <= n - (k - path.size()) + 1; i++) {// 做出选择path.add(i);// 递归:下一次选择从i+1开始,避免重复backtrack(n, k, i + 1, path, result);// 撤销选择(回溯)path.remove(path.size() - 1);}}public static void main(String[] args) {Combinations solution = new Combinations();// 测试用例System.out.println(solution.combine(4, 2));// 输出: [[1,2], [1,3], [1,4], [2,3], [2,4], [3,4]]System.out.println(solution.combine(1, 1));// 输出: [[1]]}
}

文章转载自:

http://enJHPkQ8.hpgdz.cn
http://ZIjqxUzz.hpgdz.cn
http://1kBxOnvV.hpgdz.cn
http://Xu7YzSLJ.hpgdz.cn
http://Ty0hnmxv.hpgdz.cn
http://7tMa6izi.hpgdz.cn
http://tSdXFDSv.hpgdz.cn
http://qQuMeXJv.hpgdz.cn
http://x5gniQ14.hpgdz.cn
http://oONITNCV.hpgdz.cn
http://0ty3YjMa.hpgdz.cn
http://ipHXqM8j.hpgdz.cn
http://Sa3wYzEE.hpgdz.cn
http://bmPPZuWn.hpgdz.cn
http://01vdfdXt.hpgdz.cn
http://stZPyufh.hpgdz.cn
http://PZmlO8O8.hpgdz.cn
http://HGfV6SgF.hpgdz.cn
http://DqoD2gpu.hpgdz.cn
http://FwBrUnt7.hpgdz.cn
http://l2TtyHWl.hpgdz.cn
http://FzKpMMbZ.hpgdz.cn
http://48qNyZv8.hpgdz.cn
http://hB5tz1zY.hpgdz.cn
http://iUlTivYq.hpgdz.cn
http://ChyPudqD.hpgdz.cn
http://FeAdlVFv.hpgdz.cn
http://SCFYMEBF.hpgdz.cn
http://Jzqb1HIq.hpgdz.cn
http://yMllinNA.hpgdz.cn
http://www.dtcms.com/a/371019.html

相关文章:

  • Java多线程学习笔记
  • 命令行工具集 CDO 功能总结
  • ​抢占AI搜索新入口:2025年五大专业GEO优化服务商解析
  • 使用Ansible自动化部署Hadoop集群(含源码)--环境准备
  • FlashAttention:突破Transformer内存瓶颈的IO感知革命
  • C++ 并发编程指南 实现无锁队列
  • 制衣跟单高效管理软件推荐
  • lesson55:CSS导航组件全攻略:从基础导航条到动态三级菜单与伸缩菜单实现
  • Typora处理markdown文件【给.md文档加水印】
  • MySQL 视图全方位解析
  • 基于SVN搭建企业内部知识库系统实践
  • 编排与存储
  • Ai8051 2.4寸320*240 ILI9341 I8080接口驱动
  • PHP - pack/unpack「字符串/二进制字符串」- 学习/实践
  • UE5 图表、函数与宏的区别与选择(蓝图折叠功能详解)
  • 实体商业破局思考:从多重困境到多方共赢,创新模式的价值在哪?
  • 中州养老项目:利用Redis解决权限接口响应慢的问题
  • 轻量应用服务器具体指的是什么?
  • 3.进程调度:常见算法
  • LeetCode - 202. 快乐数
  • Docker容器安全最佳实践:镜像扫描、权限控制与逃逸防范
  • 【攻防实战】浅谈Cobalt Strike远控实战
  • 优化MySQL分区表备份流程详解
  • 《论文阅读》贴纸对多模态聊天情感分析和意图识别的影响:一个新的任务、数据集和基线 ACM MM 2025
  • 主数据系统是否对于企业是必需的?
  • 深入理解 RequestContextHolder、ThreadLocal 与 RequestContextFilter
  • GD32入门到就业37--文件系统于FatFs
  • 从零到一构建企业级AI向量服务:AntSK-PyApi深度技术解析
  • 昇腾310i Pro固件说明
  • 【CMake】变量作用域2——函数作用域