題目鏈接:
D - Permutation Subsequence (atcoder.jp)
題目大意:

分析:
相對于是記錄一下每個數的位置 然后再長度為k的區間進行移動 然后看最大的pos和最小的pos的最小值是多少 有點類似于滑動窗口
用到了java里面的 TreeSet和Map TreeSet存的是數的位置 TreeSet里面有se.last() 獲取當前這個里面的最后的這個元素 也就是最大最 se.first()也就是獲取當前這個里面的第一個元素 也就是最小的 然后隨著移動 當然要刪除掉最左邊的那個元素 也就是 se.remove((i + k - 1) 這個元素的位置)
代碼:
import java.util.*;public class D2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();var mp = new HashMap<Integer, Integer>();for(int i = 1; i <= n; i ++ ) {int x;x = sc.nextInt();mp.put(x, i); // 表示的是x的下標是i}var se = new TreeSet<Integer>();int ret = n;for(int i = 1; i < k; i ++ ) {se.add(mp.get(i));}for(int i = k; i <= n; i ++ ) {se.add(mp.get(i));int dis = se.last()-se.first();ret = Math.min(ret, dis);//去除當前這個容器的左邊這個數 也就是向右移動一下se.remove(mp.get(i - k + 1));}System.out.print(ret);}
}