当前位置: 首页 > 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;}
};
http://www.dtcms.com/a/190239.html

相关文章:

  • 如何保证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杂谈——临界段保护恢复的中断状态可靠吗
  • 【解析:新能源汽车芯片主要玩家及技术发展】
  • 码题集——魔数、A的B次方、网球比赛、三角形、点与线段的关系
  • 数据清洗的艺术:如何为AI模型准备高质量数据集?
  • ACM算法
  • redis 缓存穿透,缓存击穿,缓存雪崩
  • LeetCode Hot100 (1/100)
  • 数据科学和机器学习的“看家兵器”——pandas模块 之一
  • flutter 视频通话flutter_webrtc
  • 【网络编程】八、Cookie Session 抓包原理
  • 火山引擎实时音视频 高代码跑通日志
  • 深度学习Dropout实现