1 条题解
-
0
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()); } } }
- 1
信息
- ID
- 32
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 18
- 已通过
- 9
- 上传者