目录

一、前言

二、N个字符选K个字符的组合 (求组合数 )

1、问题描述

2、相关思路

(1)python3 递归

(2)python3 内置函数

三、题例

1、上链接

2、基本思路

3、代码

(1)python函数(所有方法汇总)


一、前言

对于学计算机的同学来说,学习算法是一件非常重要的事情,废话不多讲,我们来讲讲“求组合或组合数问题”。

二、N个字符选K个字符的组合 (或求组合数 )

1、问题描述

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

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

2、相关思路

两种方法:

(1)python3 递归

思路来源于排列组合的一个公式,C(n, k) = C(n - 1, k) + C(n - 1, k - 1)。从n个数中选k个数的所有情况可以分为 “没选第n个数” 和 “选了第n个数” 两类。如果没选第n个数,那么k个数全部从其余的n - 1个数中选出,共有 C(n - 1, k) 种方式;如果选了第 n 个数,那还需要从剩余的 n - 1 个数中选 k - 1 个数,共有 C(n - 1, k - 1) 种方式。

(2)python3 内置函数

利用 itertools 中的 combinations 可以快速获得所有不重复的数字组合(排列组合)

语法为:

combinations(iterable, r)

Return successive r-length combinations of elements in the iterable.(返回iterable中连续的长度为r的元素组合。)

 combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)

注:和 permutation 一样,combinations 可对字符串、对元组、对列表、对字典( combinations 函数只对字典的键)进行排列组合。

思考:

from itertools import combinations y = {'a','a','a','b'} for i in combinations(y,2): print (''.join('%s' % p for p in i))

输出:

ab (答案不唯一,有时候输出的是ba,看返回的顺序,而返回的顺序不定)

三、题例

1、上链接

2、基本思路

同上。

3、代码

(1)python函数(所有方法汇总)

from itertools import combinations
res=[]
n,k=map(int,input().split())
for c in combinations(range(1,n+1),k):
    res.append(list(c))
print(res)


# leetcode 77题 方法一:python3内置函数
# 用时 44ms 击败 91.69%,内存 16.5MB 击败66.46%
'''
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        from itertools import combinations
        res=[]
        for c in combinations(range(1,n+1),k):
            res.append(list(c))
        return res
'''


# 方法二:python3递归
#时间 40 ms,击败 96.61%;内存 17.2 MB,击败 5.18%
'''
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        if k == 1: 
            return [[i] for i in range(1, n + 1)]
        if k == n: 
            return [list(range(1, n + 1))]
        return self.combine(n-1, k) + [x + [n] for x in self.combine(n - 1, k - 1)]
'''


# 方法三:建表存储信息(求组合数哦,不是求出所有组合哦!)
# 根据 c[i][j] = c[i-1][j]+c[i-1][j-1],我们可以从上到下,从左到右依次填表即可
# global 标志实际上是为了提示 python 解释器,表明被其修饰的变量是全局变量。
# 这样解释器就可以从当前空间 (current scope) 中读写相应变量了。
'''
# 求组合数Cab 记住公式和边界条件,当j==0时,c[i][j]=1即可。
 
N=2010
mod=1e9+7 # 取模防止爆int
c=[[0 for i in range(N)] for j in range(N)]
 
def get():
  global c
  for i in range(N):
    for j in range(i+1):
      if(j==0): # 
        c[i][j]=1
      else: # 用公式计算c[i][j]
        c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod
 
n=int(input())
get()
for k in range(n):
  a,b=map(int,input().split())
  print(c[a][b])
'''

# 测试 combinations
'''
from itertools import combinations
y = {'a','a','a','b'}
for i in combinations(y,2):
    print (''.join('%s' % p for p in i))
'''

以上,N个字符选K个字符的组合 (或求组合数 )

祝好