77. 组合


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/combinations

题目


给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

示例:

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

解题思路


思路:组合数

先审题,题目要求给定 n,返回 1…n 中所有可能的 k 个数组合。我们可以发现,这其实就是高中数学概念上的组合数问题。

组合的定义: 从 n 个不同元素中,任取 m( m ≤ n m \leq n m≤n)个不同元素组成一组,称为组合。

组合数的定义: 从 n 个不同元素中,任取 m( m ≤ n m \leq n m≤n)个不同元素的所有组合的个数,叫做组合数,记为 C n m C_{n}^{m} Cnm​。

组合数有这样一个性质:

C n + 1 m = C n m + C n m − 1 C_{n+1}^{m} = C_{n}^{m} + C_{n}^{m-1} Cn+1m​=Cnm​+Cnm−1​

这里我们令 n’ = n+1,那么上面的式子则会变成:

C n ′ m = C n ′ − 1 m + C n ′ − 1 m − 1 C_{n'}^{m} = C_{n'-1}^{m} + C_{n'-1}^{m-1} Cn′m​=Cn′−1m​+Cn′−1m−1​

其实也就等同于:

C n m = C n − 1 m + C n − 1 m − 1 C_{n}^{m} = C_{n-1}^{m} + C_{n-1}^{m-1} Cnm​=Cn−1m​+Cn−1m−1​

这里我们可以这样去理解上面的式子。假设现在从 n 个元素选 m 个元素,也就是 C n m C_{n}^{m} Cnm​。这里,我们先选择一个需要特殊考虑的元素,那么就会有以下两种情况:

  • 当选取的元素中不含这个特殊元素,那么就需要在剩余的 n-1 个元素中选出 m 个元素,也就是 C n − 1 m C_{n-1}^{m} Cn−1m​;
  • 当选取的元素中含有这个特殊元素,那么就需要从剩余的 n-1 个元素中选出 m-1 个元素,也就是 C n − 1 m − 1 C_{n-1}^{m-1} Cn−1m−1​ 。

最终,将两种情况结合起来,从 n 个元素选 m 个元素的情况。

那么就按照这个思路,进行实现,这里每次选取特殊元素为可选元素集合中最小的元素。

具体代码实现如下(递归方法)。

from typing import Listclass Solution:def combine(self, n: int, k: int) -> List[List[int]]:ans = []tmp = []def helper(special, n, k):# k 个元素选择完成,添加到返回列表中if k == 0:# 这里注意添加的是副本# 具体原因,建议自行调试查看ans.append(tmp[::])return# 表示剩余元素不够选择 k 个元素,直接返回if k > n:returntmp.append(special)helper(special+1, n-1, k-1)tmp.pop()helper(special+1, n-1, k)helper(1, n, k)return ans# n = 4
# k = 2
# solution = Solution()
# ans = solution.combine(n, k)
# print(ans)

欢迎关注


公众号 【书所集录】

LeetCode 77. 组合 | Python相关推荐

  1. LeetCode.77. 组合

    LeetCode.77. 组合 难度:中等 这道题属于回溯的经典题目: 回溯模板: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集 ...

  2. leetcode:77.组合

    77. 组合 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/combinations 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 ...

  3. Java实现 LeetCode 77 组合

    77. 组合 给定两个整数 n 和 k,返回 1 - n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], ...

  4. LeetCode 77. 组合(回溯)

    1. 题目 给定两个整数 n 和 k,返回 1 - n 中所有可能的 k 个数的组合. 示例:输入: n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[ ...

  5. LeetCode 77 组合 -- 回溯法

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/combinations 题意: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 ...

  6. Leetcode 77.组合

    组合 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1 ...

  7. LeetCode 77.组合求和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  8. leetcode 77. 组合 思考分析

    目录 1.题目 2.回溯法思路 3.参考其他思路,更深入了解这个问题 4.剪枝优化 可能需要回顾到的知识文章: 1.常用算法总结(穷举法.贪心算法.递归与分治算法.回溯算法.数值概率算法) 2.回溯法 ...

  9. LeetCode 77 组合

    题目描述 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 题解 深度优先搜索 代码 class Solution {public:void dfs(vector< ...

最新文章

  1. matlab中的i=1 length,黄伟建:matlab for i=1:length(y) 什么意思
  2. Nginx的File not found 错误解决
  3. 最新最全vuepress零基础搭建(github搭建+新增插件)
  4. 一起学Android之Menu
  5. Android开发之API29以上Environment.getExternalStoragePublicDirectory废弃的问题
  6. 安卓开发由一个APP拉起另一个APP的方法总结
  7. 腾讯Techo Park开发者大会召开在即,全球200多位专家共话云计算
  8. Python之基础练习题
  9. MYSQL的高级知识及AB复制
  10. 【计算理论】图灵机 ( 图灵机设计 )
  11. linux桌面只运行浏览器,分享|4 个 Linux 桌面上的轻量级图像浏览器
  12. 一键使 WIN 10进入休眠、睡眠、关机的命令
  13. java查询图片前台展示_Java +spring MVC 后台图片流在前台页面显示
  14. java神雕侠侣1古墓情缘游戏攻略_《神雕侠侣》手游古墓秘境1到5关详细攻略
  15. java md5加密 jar包_BeanShell调用自己写的jar包进行MD5加密
  16. 丰田增设电池生产线,加快丰田电动化进程
  17. 【信号去噪】基于改进的阈值高斯脉冲信号去噪含Matlab源码
  18. mpd无法启动的案例及解决
  19. 机器学习--逻辑回归模型(Logistic Regression)
  20. 【IDEA】- IDEA导入 mysql驱动包的时候 编译时可以找到驱动包 , 但是运行时无法找到

热门文章

  1. ISTA算法-图像压缩感知算法之ISTA算法
  2. 制作投影:3D 模型法
  3. 力扣 -- 526. 优美的排列
  4. 1.1天池学习赛新人赛代码实现及解析
  5. 一些可以显著提高大型 Java 项目启动速度的尝试
  6. [GXYCTF2019]luck_guy1题解
  7. Javascript--Set
  8. 设计师选择自由职业好还是全职工作好
  9. 华为畅享9 Plus前沿硬件技术齐上阵 千元机游戏“旗舰”机体验
  10. 8.3 证明STINGY SAT是NP完全问题