目录
一、前言
二、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个字符的组合 (或求组合数 )
祝好