今天面试的一道算法题,求教

2018-03-21 22:27:09 +08:00
 RicardoScofileld

需求是从数组 N 中获取长度为 M 的集合 example N = [1,2,3,4,5] M=3, 那么输出为 [{1,2,3}{1,2,4},{1,2,5},{2,3,4},{2,3,5}{3,4,5}]

9322 次点击
所在节点    Python
54 条回复
264768502
2018-03-21 22:57:41 +08:00
itertools groupby
siyemiaokube
2018-03-21 23:09:05 +08:00
排列组合都不会吗。。
siyemiaokube
2018-03-21 23:09:41 +08:00
一个数字标记数字的使用情况,然后搜索即可
264768502
2018-03-21 23:15:40 +08:00
itertools 的 combinations 就够了
acros
2018-03-21 23:18:08 +08:00
如果只能有序,为啥 1、3、5 不行?
xiaol825
2018-03-21 23:26:35 +08:00
itertools 的逻辑,可以参考下官方给的代码。

def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = list(range(r))
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
gclove
2018-03-21 23:26:53 +08:00
1,3,5 为什么不行,@acros 机智
lance6716276
2018-03-21 23:43:21 +08:00
C5,3 是 10 啊…要有十个啊…
whoami9894
2018-03-21 23:57:34 +08:00
@gclove 对呀 1.3.4 为啥也不行
junkiedon
2018-03-22 00:02:37 +08:00
DFS
kunluanbudang
2018-03-22 00:15:01 +08:00
把自己在 leetcode 上的垃圾代码粘贴一次
:)


```
class Solution:
def __init__(self, ):
self._res = []

def combine(self, n,k):
if (n <= 0) or (k <= 0) or (k > n):
return []
else:
c = []
self.generate_combinations(n, k, 1, c)
return self._res

def generate_combinations(self, n, k, start, c):
if len(c) == k:
self._res.append(copy.deepcopy(c))
return
else:
i = start
maxI = n - (k-len(c) )+ 1
while i <= maxI:
print(c)
c.append(i)
self.generate_combinations(n, k, i+1, c)
c.pop()

i += 1
return
```
takeoffyoung
2018-03-22 00:23:09 +08:00
kkzxak47
2018-03-22 00:24:23 +08:00
一帮不看题的,做完说题出错了
neoblackcap
2018-03-22 00:44:30 +08:00
@kkzxak47 从题主描述问题就是一个排列问题 Combination(5,3)=10,但是跟题目期望不同,要不题目少了条件,否则就是题主记错例子。
ujued
2018-03-22 00:44:57 +08:00
这 m 个数,前 m-1 个是连续的,整体递增的。这样还不好实现?
kkzxak47
2018-03-22 01:03:20 +08:00
@neoblackcap 你还在这排列组合……
neoblackcap
2018-03-22 01:24:10 +08:00
@kkzxak47 这题不考排列组合考什么呢?我看了 5 分钟,没看出其他意思,的确没看出排列以外的意思。
markx
2018-03-22 01:26:31 +08:00
@kkzxak47 题目确实没说清楚。“获取长度为 M 的集合”, 如果是要数组元素的集合的话,那这个确实是求排列,跟例子不符啊。

要不然你说一说你对题目的理解?
markx
2018-03-22 01:27:34 +08:00
@kkzxak47 啊…… 不是排列,是组合。
VincentBu
2018-03-22 02:16:30 +08:00
典型的 backtracking 题目

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/440230

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX