首页 > 编程语言 > javascript-代码随想录训练营day24

javascript-代码随想录训练营day24

时间:2022-12-09 13:33:42浏览次数:61  
标签:组合 递归 day24 javascript 随想录 let 苹果 path

77.组合

题目链接:

https://leetcode.cn/problems/combinations/

题目描述:

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

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

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

思路:

​ 本题的要求是求取所有的组合,直观的想法是使用k个for循环嵌套来实现目标。但是这里k的取值是不定的,所以无法直接直接写出所需要的循环。

​ 那么就需要换种思路,使用递归的方法能不能行呢?递归的思想是将问题转化成相同子问题的嵌套,比如摘3个苹果可以变成摘1个苹果+摘1个苹果+摘1个苹果。递归完全可以实现循环的功能。

​ 将本问题拆分如下(n=8,k=3为例):

写出代码主体:

    let path = [] //存放每一步的组合 
    let res = []  //存放最终结果
    for(let i = 1; i <= n; i++){
        path.push(i) //加入i
        backtracking(i+1) //从i+1,...,n选取k-1个数字,并记录最终结果
        path.pop() //将i清出
    }

backtracking明显为递归的函数,其中需要对终止条件进行设定。终止:path长度等于k即返回。

如果path未满,则在这个子问题中继续上面的拆分过程,选取最初始的数字+从之后的数字中选取m - 1个数字(m为这个子问题中一共要选取的数字个数)

写出该函数:

    function backtracking(start){
        let len = path.length
        //中止条件
        if(len === k){
            res.push([...path])
            return
        }
        //单层逻辑
        for(let j = start; j <= n - (k - len) + 1; j++){ //剪枝操作,个数不足就不用继续循环了
            path.push(j)
            backtracking(j+1)
            path.pop()
        }
    }

标签:组合,递归,day24,javascript,随想录,let,苹果,path
From: https://www.cnblogs.com/endmax/p/16968687.html

相关文章

  • 08JavaScript之JavaScript操作DOM对象方法
    通过元素类型的方法来操作:document.getElementById();//id名,在实际开发中较少使用,选择器中多用classid一般只用在顶级层存在不能太过依赖iddocument.getElementsByTagName......
  • JavaScript入门⑨-异步编程●异世界之旅
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......
  • 关于《代码随想录》中的一些思路的探讨
      这里提到使用返回值为新加入的节点进行父子关系赋值,我觉得既然是二叉树那么递归就得从三种遍历方式中选择一种出来,不能两次递归然后使用返回值就结束了,不符合第一眼......
  • JavaScript:操作符: 逗号运算符
    逗号运算符,是极少见的运算符,我们看一下代码理解一下逗号运算符的功能:先说结论,逗号运算符的优先级非常低,比赋值运算符=还要低;同时,逗号隔开的几个表达式,都会各自进行计算,......
  • JavaScript:操作符: 空值合并运算符(??)
    这是一个新增的运算符,它的功能是:对于表达式1??表达式2,如果表达式1的结果是null或者undefined时,返回表达式b的结果;否则返回表达式a的结果;它与赋值运算符结合使用,即??=,即......
  • JavaScript:操作符:操作符的特点
    在JS中,所有的操作符,都同时在做两件事,第一件事是进行计算,第二件事是返回计算的结果,这个结果需要有变量去接收,否则就成为无人认领的数据而被垃圾回收;在JS中,有很多不常用的......
  • JavaScript:操作符:正负号和自增自减及其隐式转换
    正负号正号即加号,负号即减号,运算结果同数学意义一样;对非数字类型进行正负号运算,会隐式转换为数字,再进行运算;一些特殊的非数字,转换情况同算术运算符;自增自减自增即为++......
  • JavaScript:操作符:比较运算符及其隐式转换
    不等关系即大于>;大于等于>=;小于<;小于等于<=当比较的两个变量,有非数字时,会隐式转换为数字再比较,转换情况同算术运算符;当两个变量均为字符串时,不会进行转换,而是逐位比较......
  • JavaScript:操作符:逻辑运算符及其隐式转换
    逻辑非!用来对布尔值进行取反,即!true=false;当取反的变量不是布尔值,会进行隐式转换为布尔值:非0的数字,都转换为true非空字符串,转换为true非空对象,转换为trueInf......
  • JavaScript:操作符:算术运算符(加减乘除模幂)及其隐式转换
    加法+减法-乘法*除法/模运算%幂运算**,即a**b求的是a的b次方执行上述运算时,当两个操作数有非数字时,JS会隐式转换为数字,再进行运算;一些特殊的非数字,会进行如下转......