import
java.util.HashMap;
import
java.util.Map;
import
java.util.Vector;
class
GFG {
static
int
minLength(
int
n,
int
k, Vector<Integer> arr) {
Map<Integer, Integer> f =
new
HashMap<>();
int
cnt =
0
;
for
(
int
i =
0
; i < n; i++) {
f.put(arr.get(i), f.getOrDefault(arr.get(i),
0
) +
1
);
if
(f.get(arr.get(i)) > k)
cnt++;
}
int
l =
0
, r = n;
int
ans = n;
while
(l <= r) {
int
mid = l + (r - l) /
2
;
for
(
int
i =
0
; i < mid; i++) {
if
(f.get(arr.get(i)) > k)
cnt--;
f.put(arr.get(i), f.get(arr.get(i)) -
1
);
}
if
(cnt ==
0
) {
ans = Math.min(ans, mid);
r = mid -
1
;
for
(
int
i =
0
; i < mid; i++) {
f.put(arr.get(i), f.get(arr.get(i)) +
1
);
if
(f.get(arr.get(i)) > k)
cnt++;
}
continue
;
}
boolean
flag =
false
;
for
(
int
i = mid; i < n; i++) {
if
(f.get(arr.get(i - mid)) >= k)
cnt++;
f.put(arr.get(i - mid), f.get(arr.get(i - mid)) +
1
);
if
(f.get(arr.get(i)) > k)
cnt--;
f.put(arr.get(i), f.get(arr.get(i)) -
1
);
if
(cnt ==
0
) {
for
(
int
j = i - mid +
1
; j <= i; j++) {
f.put(arr.get(j), f.get(arr.get(j)) +
1
);
if
(f.get(arr.get(j)) > k)
cnt++;
}
flag =
true
;
break
;
}
}
if
(flag) {
ans = Math.min(ans, mid);
r = mid -
1
;
}
else
{
l = mid +
1
;
for
(
int
i = n - mid; i < n; i++) {
f.put(arr.get(i), f.get(arr.get(i)) +
1
);
if
(f.get(arr.get(i)) > k)
cnt++;
}
}
}
return
ans;
}
public
static
void
main(String[] args) {
int
n =
4
;
int
k =
1
;
Vector<Integer> arr =
new
Vector<>(
4
);
arr.add(
3
);
arr.add(
1
);
arr.add(
2
);
arr.add(
3
);
System.out.println(minLength(n, k, arr));
}
}