LeetCode 算法入门 — 组合

77 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

组合

原题地址

给定两个整数 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. 分析下题目,以示例一为例:选组合的第一个数时有四种选择,每个都可以当做第一个数;选择第二个数时,本来也有四种选择,但是有的会产生重复,比如说 [1,2][2,1][1,3][3,1]等。因为要求不能重复,因此这种重合的数据需要被剔除,它们无法得到正确的完整解;
  2. 分析完成后,可以定义一个数组来存储正在构建的解集;
  3. 定义一个辅助函数 help 接受枚举选择的起点以及当前构建的路径为入参,定义一个结果数组 result,在辅助函数中,构建路径的长度 等于k 时,将当前路径的值存储到 result 中,结束当前递归;在构建路径长度 小于k 时,需要递归处理其他值作为起点的路径。

AC 代码

/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
    const res = []

    const help = (start, path) => { 
        if (path.length == k) {
            res.push([...path])      
            return                     
        }
        for (let i = start; i <= n; i++) { 
            path.push(i)                    
            help(i + 1, path)            
            path.pop()                     
        }
    };

    help(1, []) 
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:120 ms, 在所有 JavaScript 提交中击败了22.42%的用户
  • 内存消耗:45.8 MB, 在所有 JavaScript 提交中击败了43.32%的用户
  • 通过测试用例:27 / 27

END