尝试解决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)
答案 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测试输入。