组合
时间:2022-07-24
本文章向大家介绍组合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
组合
给定两个整数n
和k
,返回1 ... n
中所有可能的k
个数的组合。
示例
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
题解
/**
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
var combine = function(n, k) {
if(n <= k) return [[...new Array(n).keys()].map(v => v+1)];
var target = [];
var dfs = function(cur, deep, tmp){
if (tmp.length + (n - cur + 1) < k) return void 0;
if(deep === k){
target.push(tmp);
return void 0;
}
for(;cur<=n;++cur) dfs(cur+1, deep+1, [...tmp, cur]);
}
dfs(1, 0, []);
return target;
};
思路
以示例中的值为例,可以认为是一个长度为4
的数组[1, 2, 3, 4]
,每两个组合一个数组可取1
组合其数组中之后的值,2
与其数组中之后值,3
与其数组中之后的值,4
与其数组中之后值,即[1, 2]
、[1, 3]
、[1, 4]
、[2, 3]
、[2, 4]
、[3, 4]
,首先初始条件判断,若是n <= k
则只能构成一个长度为n
的数组,将其装入二维数组返回即可,后边的表达式利用了new Array(n)
生成了一个长度为n
的空数组,让后取得其keys
的迭代器,利用...
即Spread
操作符将其展开,之后使用map
将其处理为key
值+1
,之后定义目标数组,之后定义dfs
递归函数,首先进行剪枝,如果当前tmp
数组的大小为s
,未确定状态的区间[cur,n]
的长度为t
,如果s + t < k
,那么即使t
个都被选中,也不可能构造出一个长度为k
的序列,故这种情况就没有必要继续向下递归,之后判断递归深度如果与k
相等则直接将tmp
数组置入目标数组并返回,之后定义一个循环,从cur
开始到n
进行递归取值,将tmp
数组与cur
构建一个新数组传递到下一个递归中,之后启动递归初始化cur
为1
,深度deep
为0
,tmp
为一个空数组,递归完成后返回目标数组即可。
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://leetcode-cn.com/problems/combinations/
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求
- 2017奇葩机器人大盘点:一言不合让你变瞎
- 【机器学习实战】第14章 利用SVD简化数据
- 异步数据存储声明
- 区块链学堂——公有链、私有链、联盟链、侧链、互联链
- 人工智能将让我们更擅长辩论
- ASP.NET路由系统实现原理:HttpHandler的动态映射
- 腾讯、卓健科技、恩泽医疗合力打造“互联网+智慧医院”
- 区块链,不是比特币(1)
- 小程序缓存 删不删你都该知道的事儿
- 32位 or 64位:Apache CloudStack系统VM架构选择
- Apache CloudStack系统VM架构选择
- ASP.NET MVC Controller激活系统详解:IoC的应用[下篇]
- 使用Docker的Alluxio群集设置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring boot常用注解收集
- Go依赖模块版本之Module避坑使用详解
- 【tcl学习】vivado write_edif
- K8s中优雅停机和零宕机部署
- Python读取.edf格式脑电数据文件
- Kotlin修炼指南(三)——奇技淫巧
- 前端|CSS盒阴影和文字阴影
- 一文读懂Spring Boot各模块组件依赖关系
- 谈一谈|MkDocs介绍及应用
- 讲得最明白的Elasticsearch源码调试环境搭建教程
- 史上最全ThreadPoolExecutor梳理(下篇)
- JAVA|多Realm管理基础实现
- 史上最全ThreadPoolExecutor梳理(上篇)
- 使用缓存必须注意的事项
- ReentrantLock知识点梳理