私の個人的なマイクロチャネルのパブリック番号: Microstrong
マイクロチャネル公共番号ID: MicrostrongAI
マイクロチャネル公共番号説明:Microstrong(バウアー)学生は主に学習プロセスにおける機械学習、深い学習、コンピュータビジョン、インテリジェントな対話システム関連のコンテンツ、共有の研究ノートを学びます!あなたの注意を楽しみにして、一緒に進捗状況を学習の交換を歓迎します!
します。https://www.zhihu.com/people/MicrostrongAI/activitiesほとんど家にページを知っています
トピックリンク:
件名の説明:
問題解決のアイデア:
(1)時間複雑です
ACコードがあります。
# -*- coding:utf-8 -*-
import math
class Solution:
def FindContinuousSequence(self, tsum):
if tsum == 0 or tsum == 1:
return []
mid_ceil = int(math.ceil(float(tsum) / 2))
result_list = []
for i in range(1, mid_ceil + 1, 1):
temp_sum = 0
for j in range(i, 0, -1):
temp_sum += j
if temp_sum == tsum:
temp_list = [k for k in range(j, i + 1, 1)]
result_list.append(temp_list)
return result_list
if __name__ == "__main__":
sol = Solution()
print(sol.FindContinuousSequence(3))
(2)時間複雑です
私たちは、それぞれ、二つの数を最大値と最小値の大小順序を考慮することができます。まず、小さなが1に初期化し、大きなは2に初期化。sが小さいから大に配列より大きく、そして場合、値が小さいほど、すなわち小の値を増加させるために、シーケンスから除去することができます。小規模から大規模までのシーケンス場合、および以下のよりも、大きな配列は複数の数字が含まれているので、こと、増加させることができます。これは少なくとも二つのシーケンス番号でなければならないため、我々は/ 2まで小さな(1 + S)を大きくする必要があります。
そして、すべての連続したシーケンス9ためには、例えば、我々は2に初期化し、大きな、1に初期化し、小さなを置きます。小さな及び大きな配列が{1,2}である間に、我々はより多くの数字を含む次のシーケンスをしたいので、この時点で、シーケンスは、9未満3。私たちは、大きな増加には、この時系列{1,2,3} 3を入れました。配列が6であるので、我々は次に4が大きくなる追加、依然として以下9以上であり、小型で大きな配列との間に介在し、また、{1,2,34}をなろう。配列は10と9よりも大きいので、我々は、シーケンス内のいくつかの番号に省略されている、我々は2が小さくなり、このときに得られた配列は{2,3,4}であり、そして配列正確9加えます。我々はそれをプリントアウトし、第一および連続したシーケンス9を発見しました。次に我々は、ビッグを追加前工程を繰り返し、そして9 {4,5}の第二の連続配列について見出すことができます。全体のプロセスは、以下の表に要約することができます。
ステップ | 小さい | 大きい | シーケンス | そして、シーケンス | Sと比較すると | 次のステップ |
1 | 1 | 2 | 1,2 | 3 | 以下 | ビッグ増加 |
2 | 1 | 3 | 1,2,3 | 6 | 以下 | ビッグ増加 |
3 | 1 | 4 | 1,2,3,4 | 10 | より大きい | 小さな増加 |
4 | 2 | 4 | 2,3,4 | 9 | 等しいです | シーケンス、増加の大きな保存 |
5 | 2 | 5 | 2,3,4,5 | 14 | より大きい | 小さな増加 |
6 | 3 | 5 | 3,4,5 | 12 | より大きい | 小さな増加 |
7 | 4 | 5 | 4,5 | 9 | 等しいです | シーケンスの保存 |
明確な問題解決のアイデアを形成した後、私たちは、コードを書き始めることができます。ここでは、参照コードはACがあります。
# -*- coding:utf-8 -*-
class Solution:
def FindContinuousSequence(self, tsum):
# write code here
if tsum == 0 or tsum == 1 or tsum == 2:
return []
result_list = []
mid = int((tsum + 1) // 2)
array = [i for i in range(0, mid + 1)]
small = 1
big = 2
temp_sum = array[small] + array[big]
temp = [array[small], array[big]]
while True:
if temp_sum == tsum:
temp_list = [t for t in temp]
result_list.append(temp_list)
if big < len(array) - 1:
big += 1
temp_sum = temp_sum + array[big]
temp.append(array[big])
else:
return result_list
if temp_sum > tsum:
temp_sum = temp_sum - array[small]
temp.remove(array[small])
small += 1
if temp_sum < tsum:
if big < len(array) - 1:
big += 1
temp_sum = temp_sum + array[big]
temp.append(array[big])
else:
return result_list
return result_list
上記のコードでは、連続した配列および小塗布技術を求めます。典型的には、我々は、連続ループシーケンスを使用するが、各操作の後考慮配列のシーケンスを取得し、図形のほとんどの動作の前には、単に数を増加または減少に比べて同じであるので、我々は、以前の缶かもしれませんそして、動作シーケンスとの塩基配列を求めました。これにより、コードの効率を向上させる、不要な操作を減らすことができます。
参照:
[1]は、ハイタオ「安全プランを証明します」。