给定10 x N矩阵的1&0和0,例如:
1 1 1 1 1 1 1 1
1 1 0 1 1 0 0 1
0 0 0 1 1 0 0 1
0 0 0 1 1 0 0 0
1 0 0 0 0 1 0 0
1 0 1 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
注释:
列中的零总是在连续1次的两次运行之间。例如,不允许使用列,例如1 1 1 0 1 0 1 1 1 1
每个列必须至少有一个零间隔,即列,例如:1 1 1 1 1 1 1 1 1 1
不允许
我想从左到右找到最长的零连续条纹。在这种情况下,那将是4,它对应于从顶部开始的第5行的第二列开始的路径,
第二长的是3,其中有3个例子。
我有点难过,特别是对于非常大的N(~10M)。我正在寻找正确的方法/数据结构使用的建议或类似的问题和那里使用的算法。建模问题的另一种可能方法是使用两个列表来表示问题:
L1 = [2, 2, 1, 4, 4, 1, 1, 3]
L2 = [6, 3, 5, 5, 5, 5, 5, 5]
但仍不太确定如何提出有效的解决方案
答案 0 :(得分:2)
使用itertools.groupby(),sum()
和max()
函数的解决方案:
import itertools
m = [
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 0, 1, 1, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 0, 0],
[1, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]
]
max_zero_len = max(sum(1 for z in g if z == 0)
for l in m for k,g in itertools.groupby(l))
print(max_zero_len)
输出:
4
for l in m for k,g in itertools.groupby(l)
- 将为每个嵌套列表的1
和0
值的每个连续序列生成一个单独的组。 (如[1,1], [0], [1,1], [0,0] ...
)
sum(1 for z in g if z == 0)
- 仅考虑0
个序列,并使用sum
函数计算其长度
max(...)
- 获取零(0
)个序列中的最大长度