解決しようとするhackerrank問題。なぜ毒性植物はTLEを与えるスタック溶液ですか?
庭に植物があります。これらの植物のそれぞれにはある量の農薬が加えられています。毎日の後、左側の植物よりも多くの農薬が残っている場合、左側の植物よりも弱い植物が死んでしまいます。各プラントの農薬の初期値が与えられます。植物が死ぬまでの日数、すなわち、残っている植物よりも多くの農薬含有量を有する植物がない時間を印刷する。
私はこの問題を解決するためにスタックを使用しました。以下の例:
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
この後、で新しいリストを作成します。リストを逆の順序で並べ替えると、プロセスが再び開始され、終了します。
これはまだ私に時間を超えています。何か案が?
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)
編集コード:
n = int(input())
input = [int(i) for i in input().split()]
count, t_length = 0, 0
cmp = input[0]
while True:
length = len(input)
for i in range(1, length):
if input[i] == -1:
t_length += 1
continue
if input[i] > cmp:
cmp = input[i]
input[i] = -1
else:
t_length += 1
cmp = input[i]
if t_length+1 == length:
break
count += 1
cmp, t_length = input[0], 0
print(count)
'a'や' b'のような無意味な変数名を使用すると、hackerrankはより良いスコアを与えますか?もしそうでなければ、なぜそれをやっていますか? – Barmar
これは少なくともO(n^2)[ソートをリニアタイムチェックで置き換えた場合]と思われます。入力リストの長さを100,000とすると、単純な方法で解決でき、よりスマートな方法を見つけることができるという考えを破棄する必要がありますか? –
リンクされたリストは、アルゴリズムがどのように機能するかに関する基本的なことは変わりませんが、コードを一定の速度でスピードアップする有望な方法のように見えますが、通常の配列を作成し、特定の日の値を反復処理するときに、その場で要素を削除します。確かにあなたは毎回ソートしたくありません。どのような最適化でも、コードがハッカーブランクテストに合格するのに十分速く動くかどうかは分かりません。私の推測はそうではありませんが、テスト入力が特に厄介であるかどうかによって異なります。 –