この課題は、入学試験からクローズドナンバーのサイバーセキュリティコースまでです。とにかくサイバーセキュリティとは関係なく、学生の論理的スキルとコーディングスキルをテストするだけです。
仕事
配列からエントリを削除するプログラムを作成して、残りの値が厳密に減少する順序で並べ替えられ、その合計が他のすべての可能な減少シーケンスの中で最大化されるようにします。
入出力
入力は、整数値の配列になり、厳密に大きいより0
、すべて互いに異なります。ファイル、コマンドライン、またはstdinから入力を読み取るかどうかは自由に選択できます。
出力は降順でソートされます、入力のもののサブ配列になり、その合計は他の可能な降順でソートされたサブ配列よりも大きくなります。
注: [5, 4, 3, 2]
は、とが隣接していない[5, 4, 1, 3, 2]
場合でも、のサブ配列です。という理由だけで4
3
1
ポップされました。
ブルートフォースソリューション
もちろん、最も単純な解決策は、与えられた配列のすべての可能な組み合わせの中で繰り返し、最大の合計でソートされた配列を検索することです。
import itertools
def best_sum_desc_subarray(ary):
best_sum_so_far = 0
best_subarray_so_far = []
for k in range(1, len(ary)):
for comb in itertools.combinations(ary, k):
if sum(comb) > best_sum_so_far and all(comb[j] > comb[j+1] for j in range(len(comb)-1)):
best_subarray_so_far = list(comb)
best_sum_so_far = sum(comb)
return best_subarray_so_far
残念ながら、配列がソートされているかどうかをチェックし、それの要素の和を計算するのでれると、この動作が行われるために時間をからに、漸近的時間計算量は次のようになります
チャレンジ
あなたの目標は、上記のブルートフォースよりも時間の複雑さを改善することです。漸近的な時間の複雑さが最小のソリューションが課題の勝者です。2つのソリューションの漸近的な時間の複雑さが同じ場合、勝者は、漸近的な空間の複雑さが最も小さいものになります。
注: 多数であっても、読み取り、書き込み、およびアトミックの比較を検討できます。
注意: 2つ以上のソリューションがある場合は、いずれかを返します。
テストケース
Input: [200, 100, 400]
Output: [400]
Input: [4, 3, 2, 1, 5]
Output: [4, 3, 2, 1]
Input: [50, 40, 30, 20, 10]
Output: [50, 40, 30, 20, 10]
Input: [389, 207, 155, 300, 299, 170, 158, 65]
Output: [389, 300, 299, 170, 158, 65]
Input: [19, 20, 2, 18, 13, 14, 8, 9, 4, 6, 16, 1, 15, 12, 3, 7, 17, 5, 10, 11]
Output: [20, 18, 16, 15, 12, 7, 5]
Input: [14, 12, 24, 21, 6, 10, 19, 1, 5, 8, 17, 7, 9, 15, 23, 20, 25, 11, 13, 4, 3, 22, 18, 2, 16]
Output: [24, 21, 19, 17, 15, 13, 4, 3, 2]
Input: [25, 15, 3, 6, 24, 30, 23, 7, 1, 10, 16, 29, 12, 13, 22, 8, 17, 14, 20, 11, 9, 18, 28, 21, 26, 27, 4, 2, 19, 5]
Output: [25, 24, 23, 22, 17, 14, 11, 9, 4, 2]