[プログラマー]ジュエリーショッピング(Python)
5742 ワード
ダブルポインタで解決すべきだと思いますが、アイデアが思いつかないので、他の人の問題を解くを参考にしました.文章の核心について以下のように理解した.
上記の過程で得られた区間のうち、最小区間を求めればよい.アイデアに基づいて実現すると、中に歪みが現れ、あるTCで
区間[a,b]からすべての種類の宝石が買えるようになったことからa+=1となる.△i.e.区間の範囲が縮小した。そしてすべての範囲の宝石が買えるかどうか見てみましょう。買えるものは買えないまで縮小する。逆に、絞り込んだ区間で全ての種類の宝石が買えない場合は、b+=1として区間の範囲を広げ、全ての種類の宝石が買えるかを確認します。この手順を、aがnまたはbがnになるまで繰り返します。(nは宝石数)
上記の過程で得られた区間のうち、最小区間を求めればよい.アイデアに基づいて実現すると、中に歪みが現れ、あるTCで
a>b (아래의 코드에서는 lp > rp)
のとき.(e.g.24579142)正解は得られましたが、私のコードではなく上のリンクを参照することをお勧めします.1.コード
from collections import defaultdict
def solution(gems):
size = len(gems)
kinds = len(set(gems))
d = defaultdict(int)
lp, rp = 0, 0
answer = [0, int(1e9)]
count = 0
has_all_kind = False
while lp < size and rp < size:
if not has_all_kind:
if not d[gems[rp]]: count += 1
d[gems[rp]] += 1
if count == kinds:
d[gems[lp]] -= 1
if not d[gems[lp]]: count -= 1
answer = min(answer, [lp+1, rp+1], key=lambda x: abs(x[0]-x[1]))
lp += 1
has_all_kind = True
continue
has_all_kind = False
rp += 1
return answer
Reference
この問題について([プログラマー]ジュエリーショッピング(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@study-dev347/프로그래머스-보석-쇼핑テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol