假设我有一个列表说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))
答案 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')))