1 条题解

  • 0
    @ 2025-5-9 16:52:51

    JAVA AC代码:

    import java.util.*;
    import java.util.StringTokenizer;
    import java.io.*;
    
    public class Main {
    
        public static void main(String[] args) {
            int n=in.nextInt(),k=in.nextInt();
            int []arr=new int[n];
            Deque<Integer> deque1=new ArrayDeque<Integer>();//双端队列记录最小值
            Deque<Integer> deque2=new ArrayDeque<Integer>();//双端队列记录最大值
            for(int i=0;i<n;i++) arr[i]=in.nextInt();//数据读入
            int[][] ans=new int[n-k+1][2];//初始化答案数组
            for(int i=0;i<n;i++) {
                //队列非空的情况下,找出所有下标不符合当前区间的值删除
                while(!deque1.isEmpty()&&deque1.peekFirst()<i-k+1) deque1.removeFirst();
                while(!deque2.isEmpty()&&deque2.peekFirst()<i-k+1) deque2.removeFirst();
                //比较队列的最后端(最大/最小值)和当前的arr[i]
                //如果记录最小值的队列的末端(最大值)比当前值大(或相等),就把最末端移除,确保当前值是最末端的时候最大
                while(!deque1.isEmpty()&&arr[i]<arr[deque1.peekLast()]) deque1.removeLast();
                //记录最大值的队列的末端
                while(!deque2.isEmpty()&&arr[i]>arr[deque2.peekLast()]) deque2.removeLast();
                //将当前下标加入队列最末端
                deque1.offerLast(i);
                deque2.offerLast(i);
                //如果i的值够了就加入答案数组
                if(i>=k-1) {
                    ans[i-k+1][0]=arr[deque1.peekFirst()];
                    ans[i-k+1][1]=arr[deque2.peekFirst()];
                }
            }
            for(int i=0;i<=n-k;i++) out.print(ans[i][0]+" ");
            out.println();
            for(int i=0;i<=n-k;i++) out.print(ans[i][1]+" ");
            out.close();
        }
        
        
    
        static FastReader in=new FastReader();
        static PrintWriter out=new PrintWriter(System.out);
        static class FastReader{
            static BufferedReader br;
            static StringTokenizer st;
            FastReader(){
                br=new BufferedReader(new InputStreamReader(System.in));
            }
            String next() {
                String str="";
                while(st==null||!st.hasMoreElements()) {
                    try {
                        str=br.readLine();
                    }catch(IOException e) {
                        throw new RuntimeException(e);
                    }
                    st=new StringTokenizer(str);
                }
                return st.nextToken();
            }
            int nextInt() {
                return Integer.parseInt(next());
            }
            double nextDouble() {
                return Double.parseDouble(next());
            }
            long nextLong() {
                return Long.parseLong(next());
            }
        }
        
    }
    

    信息

    ID
    32
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    18
    已通过
    9
    上传者