为什么Poisonous植物堆叠解决方案给TLE?

时间:2016-05-13 00:24:31

标签: python algorithm stack

尝试解决hackerrank问题。

花园里有植物。这些植物中的每一种都添加了一定量的农药。每天之后,如果任何植物的农药比其左边的植物多,比左边的植物弱,它就会死亡。您将获得每种植物中农药的初始值。打印没有植物死亡的天数,即没有植物的农药含量高于其左侧植物的时间。

我用堆栈来解决这个问题。示例如下:

if (enabled && msie < 8) {

之后只需使用a = 6 5 8 4 7 10 9 10 > 9 a = 6 5 8 4 7 10 b = 9 7 > 10 a = 6 5 8 4 7 b = 9 4 > 7 a = 6 5 8 4 b = 9 8 > 4 a = 6 5 8 b = 9 4 5 > 8 a = 6 5 b = 9 4 6 > 5 a = 6 5 b = 9 4 创建一个新列表。再次启动该过程,并在列表按相反顺序排序时退出。

这仍然让我超时。有什么想法吗?

a = a + b.reverse()

编辑代码:

n = int(input())
first_list = input().split()
first_list = [int(i) for i in first_list]
count = 0
second_list = []
data_1, data_2 = 0, 0
while True:
  b = []
  if sorted(first_list, reverse=True) == first_list:
    break
  data_1 = first_list.pop()
  for i in range(len(first_list)-1):
    data_2 = first_list.pop() 
    if data_1 > data_2:
      pass
    elif data_1 < data_2:
      second_list.append(data_1)
    elif data_1 == data_2:
      second_list.append(data_1)
      second_list.append(data_2)
    data_1 = data_2
  if len(first_list)>=1 and data_1 < first_list[0]:
    first_list.append(data_1)
  second_list.reverse()
  first_list = first_list + second_list
  count += 1
print(count)

2 个答案:

答案 0 :(得分:0)

排序为N log N,您的数据结构对我来说似乎不对。为什么不使用双向链表,因为要求是它是最左边的邻居。你只需要取消引用死亡的指针。

答案 1 :(得分:0)

我同意Woot4Moo的看法并不合适,我建议你更多地关注堆栈使用(而不是双向链接列表)。请参阅this link to the Stock Span problem,其中有助于详细说明用于跟踪价格列表差异的O(N)解决方案。这可以延长农药的条件。

例如,它填补了以下空白:

import sys

ps = [int(s) for s in list(sys.stdin)[1].strip().split()]
stack = [ps[0]]
max_days = 0
for i in range(1, len(ps)):
    days[i] = 1 if ps[i] > ps[i-1] else 0

    # TODO - Logic to update days[i] 
    while len(stack) > 0 and ps[i] <= stack[-1][1]:
        (ps_other, days_other) = stack.pop()

    stack.append((ps[i], days[i])
    max_days = max(max_days, days[i])

print(max_days)

我在O(N^2)中快速实现,发现80%的测试通过(其余时间超时),因此根据上面的链接更巧妙地使用堆栈应该可以完成这项工作。

import collections
import sys

ps = [int(s) for s in list(sys.stdin)[1].strip().split()]
ps_prev = []
days = 0
while collections.Counter(ps_prev) != collections.Counter(ps):
    ps_prev = ps[:]
    i = len(ps) - 1
    while i > 0:
        if ps[i] > ps[i-1]:
            ps.pop(i)
        i -= 1            
    days += 1      

print(days - 1)

编辑:请注意,粗略的sys.stdin使用是为了满足HackerRank测试输入。