给定颜色的最长序列

时间:2018-08-10 05:38:30

标签: algorithm list binary-search

假设我们有一个包含黑色和白色值的元素列表。是否有O(N)算法来查找包含黑色元素的最长序列?

我知道使用二进制搜索可以在O(Nlog(N))处进行。我想知道我们能否做得更好。

3 个答案:

答案 0 :(得分:2)

您可以保留数组的第一个值及其索引。并分配maxCount和maxIndex来保持最长序列开始的位置。

Create oldValue and assign first value of array 
Create maxCount variable
Create maxIndex variable (it should be 0 because we use first value of array)

Move on array - start with 2nd element (because we used first already)
   if new value is equal old value
      go to next element and increase count
   else
      check if count > maxCount
         if so maxCount = count and maxIndex = i
         else count = 0 
   and oldValue = currentValue

执行该操作,直到到达数组末尾。也是O(N)。我不编写任何代码,因为我相信您应该自己做。您尝试后可以问任何问题。

答案 1 :(得分:2)

我认为Kadane的算法会在可能的最佳时间为您提供解决方案。考虑包含您的“黑色”和“白色”的ListItems,因此对于一个实例,我们跟踪到目前为止已连续计数了多少个“黑色”项目,如果遇到“白色”,则将计数器重置为零,如果在在任何时候,我们的元素“黑色”或“白色”的计数都超过了全局最大计数,然后我们用局部计数更新了全局计数。

我已经用python编写了代码,非常欢迎评论和编辑。我是StackOverflow(和编码)的新手。

此外,您可以在herehere上查找它,以便更好地理解。

ListItems = ['Black', 'White', 'Black', 'Black', 'White', 'White', 'White', 'White','Black','Black','Black','Black', 'White', 'White','Black', 'White', 'White','Black','Black', 'White', 'White']


maxi = 0
max_so_far = 0

for i in ListItems:
  if i =='Black':
    maxi += 1

  else:
    maxi = 0 

  if maxi > max_so_far:
    max_so_far = maxi

print(max_so_far)

答案 2 :(得分:-2)

我觉得我可能对这个问题有误解,但是:逐一浏览所有这些内容?