0.試合後のまとめ
旧正月の3日目はあまり遊びたくなかったのですが、最近、なんらかの理由で比較的低い状態になっていると感じましたが、ランキングは下がると推定されています。ゲームですが、私は自分自身を手放すのではないかと心配しています。この種の諦めを標準として採用するので、結局、彼はまだ歯を食いしばってゲームをしました。幸運なことに、私は幸運で、最終的に4つの質問すべてが完了しました。最後の質問は非常に愚かで不必要であり、継続的な残業が最終ランキングに影響を及ぼしましたが、最終的には4つの質問すべての結果はそれほど悪くありませんでした。とにかく、個人的には、それは快適な場所です...
ちなみに、正月にハイプレーして忘れてしまったからではありません...
1.トピック1
質問1に与えられた質問へのリンクは次のとおりです。
1.問題解決のアイデア
最終結果は0101
繰り返し文字列または繰り返し文字列のいずれかであるため、この質問のアイデアは非常に単純1010
です。
したがって、次の2つの状況で経験する必要のある操作の数を調べてから、より少ない数を取得して最終結果を得るだけで済みます。
2.コードの実装
Pythonコードは次のとおりです。
class Solution:
def minOperations(self, s: str) -> int:
odd = 0
even = 0
for i, c in enumerate(s):
if i % 2 == 0:
if c == "0":
even += 1
else:
odd += 1
else:
if c == "1":
even += 1
else:
odd += 1
return min(odd, even)
コード評価を送信した後、48ミリ秒と14.4MBのメモリが必要でした。
2.トピック2
トピック2のテスト問題へのリンクは次のとおりです。
1.問題解決のアイデア
この質問は最初は少しトリッキーでしたが、実際には後で考えるのは非常に簡単です。つまり、最初に同じ文字の連続した出現回数を数え、次に繰り返し回数を個別に計算します。
明らかに、繰り返し数がnで長さがlの連続部分文字列の場合、それに含まれる同形文字列の数はn⋅k⋅(k + 1)2 n \ cdot \ frac {k \ cdot(k +1)です。 )} {2}n⋅2K ⋅ (K + 1 )。
したがって、次のように最終的なコード実装をすばやく行うことができます。
2.コードの実装
Pythonコードは次のとおりです。
class Solution:
def countHomogenous(self, s: str) -> int:
MOD = 10**9+7
cache = {
}
cnt = 0
for idx, c in enumerate(s):
if idx == 0:
cnt += 1
else:
last = s[idx-1]
if c == last:
cnt += 1
else:
if last not in cache:
cache[last] = {
}
if cnt not in cache[last]:
cache[last][cnt] = 0
cache[last][cnt] += 1
cnt = 1
last = s[-1]
if last not in cache:
cache[last] = {
}
if cnt not in cache[last]:
cache[last][cnt] = 0
cache[last][cnt] += 1
# print(cache)
res = 0
for item in cache.values():
for cnt, repeat in item.items():
res = (res + repeat * cnt * (cnt+1) // 2) % MOD
return res
評価のためにコードを送信した後、212ミリ秒かかり、15.1MBのメモリを消費しました。
3.トピック3
トピック3のテスト問題へのリンクは次のとおりです。
1.問題解決のアイデア
この質問を受けた後の最初のアイデアは、欲張り法を使用してバッグ内のボールを分割する方法を調査し、優先操作の数の中で直接最大数のボールを取得しようとすることです。
しかし、各バッグのボールをどのように分割するかは、他のバッグのボールの数と許可される操作の最大数に依存するため、Greedyのアイデアは実行不可能であるように思われることが後で発見されました。
したがって、私たちは考えを変え、二分法を使用して直接答えを検索することしかできず、この時点でテストに合格することができます。
2.コードの実装
Pythonコードは次のとおりです。
class Solution:
def minimumSize(self, nums: List[int], maxOperations: int) -> int:
_min = 1
_max = max(nums)
nums = Counter(nums)
def count_op(nums, tgt):
res = 0
for n, t in nums.items():
res += t * ((n-1) // tgt)
return res
if count_op(nums, _min) <= maxOperations:
return _min
while _min < _max-1:
m = (_min + _max) // 2
if count_op(nums, m) <= maxOperations:
_max = m
else:
_min = m
return _max
評価のためにコードを送信した後、1448ミリ秒かかり、29.8MBのメモリを消費しました。
4.トピック4
質問4のテスト問題へのリンクは次のとおりです。
1.問題解決のアイデア
この質問のアイデアは最初は正しかったのですが、実装の詳細についてはあまり明確に考えていなかったため、最初はn回タイムアウトになり、ほとんど通過しなかった後、運用効率も向上しましたひどい。
最も厄介なのは、私のソリューションと現在の最適なアルゴリズムの実装との間に1つの種類の違いしかないことにようやく気づいたことです。それは、一瞬で本当に崩壊しました...
言うまでもありませんが、解決策について話しましょう。実際、それは非常に簡単です。接続されたトリプルを形成できるすべての要素を数え、その次数を計算した後、最小値を見つけることです。
したがって、最初にすべてのノードの接続ノードを記録し、次に各エッジの2つのノードの両方のノードに接続されているノードを見つけて、次数を計算するだけで済みます。
すべてのエッジをトラバースすると通過できますが、効率は低すぎますが、最初に各ノードの接続の程度に応じて並べ替えると、プログラムの実行効率を最適化し、全体的な実行効率を高めることができます。一桁以上。
2.コードの実装
ここでは、コードを提供せず、公式Webサイトで次のように直接最適なコード実装を提供します。
class Solution:
def minTrioDegree(self, n: int, edges: List[List[int]]) -> int:
graph=collections.defaultdict(set)
for x,y in edges:
graph[x].add(y)
graph[y].add(x)
nds=sorted([[len(graph[x]),x] for x in graph])
nnds=sorted([[len(graph[x])+len(graph[y]),x,y] for x,y in edges])
ans=3*n*(n-1)
for w0,x,y in nnds:
if w0>=ans:
break
for w1,z in nds:
if w0+w1>=ans:
break
if z in graph[x] and z in graph[y]:
ans=min(ans,w0+w1)
break
return ans-6 if ans<3*n*(n-1) else -1
前述のように、上記のコードには実装よりも2種類多く、実行効率が1桁以上向上しています。
最後に、コード評価が提出されました。それは648msを要し、51MBのメモリを占有します。