配列と数値 N があります。
配列には、0、1、2、3....N の数値を入力できます。
たとえば、arr={1,0,2,3,1,0,2,4,3,1,0,2,4,3,0,0,0} //N=4の場合
すべての数字 1、2、...N を含む最小長のサブ配列を見つける必要があります。
たとえば、上記の配列の答えは {1,0,2,3,1,0, 2,4,3,1 ,0,2,4,3,0,0,0}// length=4である必要があります、インデックスは start=6、end=9、//0 ベース
上記の質問の可能な答えの 1 つは {1,0,2, 3,1,0,2,4 ,3,1,0,2,4,3,0,0,0} ですが、その長さは 5 であるため、拒否されました..最小の長さのサブ配列が複数ある場合、答えは1回出現するはずです。または、配列に 1、2、..N の間の 1 つまたは複数の数値が含まれていない場合、答えは「サブ配列が見つかりません」です。
これは私のpythonコードです.いくつかのケースでは間違った答えを出しています(私にはわかりません)...誰かが私が間違っていることを教えてくれたら.
shortlen=2000001 //initialise to INFINITY
shortstart=0
matchln=len(match) //match is the array containing integers
while(i<matchln):
if(match[i]>0):
leng=0
pos=[0]*n // array to keep status of found integers
j=i
start=i
sums=0
while(j<matchln and sums!=n):
if(match[j]>0):
if(pos[match[j]-1]==0): //only update status if the integer is not marked previously.
pos.pop(match[j]-1)
pos.insert(match[j]-1,1) //(match[j]-1) becuz array indexing is from 0.
sums+=1
j+=1
leng=j-i
if(j==matchln and sums!=n): // if the loop terminated,without marking all integers,that means we shouldn't proceed.
break
if(leng<shortlen): //if the length calculated is smaller then existing,then update it.
shortlen=leng
shortstart=start
i+=1