• LeetCode 77. 组合 | Python


    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 leq n$)个不同元素组成一组,称为组合。

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

    组合数有这样一个性质:

    $$C_{n+1}^{m} = C_{n}^{m} + C_{n}^{m-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}$$

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

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

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

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

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

    from typing import List
    
    class 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:
                    return
    
                tmp.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)
    

    欢迎关注


    公众号 【书所集录

  • 相关阅读:
    【Vue】如何写一个表格列显隐控制的组件?
    【Element】eloption value 绑定对象类型(item)
    【读书笔记】《你不知道的 JavaScript(上卷)》
    理解RESTful Api设计
    【群答疑0527】pandas read_csv数字显示科学计数法问题
    面试技巧
    【算法】链表的基本操作和高频算法题
    定制ASP.NET 6.0的应用配置
    ABP vNext系列文章和视频
    定制ASP NET 6.0框架系列文章
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13633744.html
Copyright © 2020-2023  润新知