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

77. 组合【 力扣(LeetCode) 】

文章目录

  • 零、原题链接
  • 一、题目描述
  • 二、测试用例
  • 三、解题思路
  • 四、参考代码

零、原题链接


77. 组合

一、题目描述

给定两个整数 nk,返回范围 [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]]

提示:

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

三、解题思路

  1. 基本思路:
      回溯法 + 剪枝。
      为了保证不重复,我们只需要保证每个序列都是递增,所以序列的每个位置取值都有范围,第 i 个数的取值范围为 [i,n-k+i]
  2. 具体思路:
    • 回溯:
      • 如果该元素超出该位置的范围,则返回。【剪枝】
      • 序列 vec 添加该元素。
      • 如果是最后一个元素,则将序列 vec 添加到 ans 并弹出最后一个元素。
      • 递归遍历下一个位置的元素。
      • 弹出最后一个元素【回溯要恢复状态】

四、参考代码

时间复杂度: O ( k ⋅ C n k ) \Omicron(k\cdot C_n^k) O(kCnk) 【一共 C n k C_n^k Cnk 的序列,每个序列 k 个元素】
空间复杂度: O ( k ) \Omicron(k) O(k) 【递归栈最深为 k 】

class Solution {
public:vector<vector<int>> ans;vector<int> vec;int _n;void dfs(const int& i, const int& k) {if (i > _n - k + 1)return;vec.emplace_back(i);if (k == 1) {ans.emplace_back(vec);vec.pop_back();return;}for (int j = i + 1; j <= _n; j++) {dfs(j, k - 1);}vec.pop_back();}vector<vector<int>> combine(int n, int k) {_n = n;int t = n - k + 1;for (int i = 1; i <= t; i++)dfs(i, k);return ans;}
};

相关文章:

  • 如何保证RabbitMQ消息的顺序性?
  • 【苍穹外卖-管理端部分-学习笔记】
  • ChromeDriver进程泄漏问题分析与最佳实践解决方案
  • unity 鼠标更换指定图标
  • 关于嵌入式系统的知识课堂(一)
  • 【1000以内具有12个以上因子的整数并输出它的因子】2021-12-27
  • FFplay 音视频同步机制解析:以音频为基准的时间校准与动态帧调整策略
  • JVM调优实战
  • Qt之Qfile类
  • 用HBuilder运行小程序到微信开发者工具
  • 【​​HTTPS基础概念与原理​】​​HTTPS vs HTTP:为什么现代网站必须用HTTPS?
  • [目标检测] YOLO系列算法讲解
  • Manus逆向工程:AI智能体的“思考”与“行动”
  • Nginx 反向代理 静态文件404异常处理
  • 【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发
  • MySQL知识点总结(持续更新)
  • 企业数字化转型背景下的企业知识管理挑战与经验杂谈
  • GTM4.1-CCM
  • ARM杂谈——临界段保护恢复的中断状态可靠吗
  • 【解析:新能源汽车芯片主要玩家及技术发展】
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等
  • 尹锡悦涉嫌发动内乱案举行第三次庭审
  • 伊朗外长称正与美国进行“善意”的会谈
  • 妻子藏匿一岁幼儿一年多不让丈夫见,法院发出人格权侵害禁令
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • 金融监管总局:做好2025年小微企业金融服务工作