由所有' 1组成的最长子阵列的长度。

时间:2017-12-03 13:39:13

标签: python algorithm python-3.x python-2.7

假设我有一个列表说x=[1,0,0,1,0,1,1,1,0,1,1,0]。这里有连续1的最长子数组长度为3.我有ao(n)方法但是可以使用段树在o(logn)中完成如何?我正在练习基于分段树的问题,我很好奇如何处理这个问题我希望减少复杂性。

a=[1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0]
size=len(a)
counter=0
lis=[]
for _ in range(size):
    if a[_]==1:
        counter+=1
    else:
        lis.append(counter)
        counter=0
print(max(lis))

4 个答案:

答案 0 :(得分:9)

一般情况下,你不能比O(n)做得更好:让我们假设我们有

[0, 0, 0... 0, 1, 0 ... 0]

全部为零和一个1。为了区别于全零情况,您必须找出唯一的1 - 您必须扫描整个列表,因为1的立场可以是任意的。

如果您获得时间复杂度优于O(n)的算法,则可以轻松创建计数器示例。在全零情况下运行算法。由于算法优于O(n),因此无法检查列表中的所有项目。将其中一个跳过的项目更改为1并再次运行算法。

答案 1 :(得分:4)

正如Dmitry Bychenko指出的那样,你无法改进算法的时间复杂度,但对于手头的情况,使用一些C优化的工具比普通的Python循环可以加快速度:

from itertools import groupby

a = [1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0]
m = max(sum(g) for k, g in groupby(a) if k == 1)

答案 2 :(得分:2)

此解决方案应该更快,因为它会消除对list的缓慢附加。

a = [1,1,0,1,1,0,1,1,0,1,1,1,0,1,1,1,1,0]
m = c = 0
for i in a:
    if i:
        c += 1
    else:
        m = max(c, m)
        c = 0

m = max(c, m)

m(最大)设为4

答案 3 :(得分:1)

如何将所有数字的字符串拆分为零并查找结果元素的max长度。

>>> a_list = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0]
>>> max(''.join(map(str, a_list)).split('0'))
'1111'
>>> len(max(''.join(map(str, a_list)).split('0')))
4
>>> ones = [1, 1, 1]
>>> max(''.join(map(str, ones)).split('0'))
'111'
>>> len(max(''.join(map(str, ones)).split('0')))
3

修改: 我在这里的评论中喜欢Stefan Pochmann的回答:len(max(bytes(a_list).split(b'\0')))