挑战程序竞赛系列(54):4.4 双端队列(1)
来源:互联网 发布:手机淘宝登录电脑版 编辑:程序博客网 时间:2024/05/22 04:40
挑战程序竞赛系列(54):4.4 双端队列(1)
详细代码可以fork下Github上leetcode项目,不定期更新。
练习题如下:
- POJ 2823: Sliding Window
POJ 2823: Sliding Window
好吧,单调队列入门题,关于单调队列可以参考博文:
http://blog.csdn.net/u014688145/article/details/71475303
此处代码参照《挑战》P339,唉,被Java的StringBuilder坑了很久,用数组输出即可,直接StringBuilder会内存溢出。
因为双端队列维护的下标,所以能够很容易的更新队列中的下标,使它始终在滑动窗口所示的范围内。
代码如下:
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.Arrays;import java.util.StringTokenizer;public class Main{ String INPUT = "./data/judge/201709/P2823.txt"; public static void main(String[] args) throws IOException { new Main().run(); } static final int MAX_N = 1000000 + 16; int N, K; int[] nums = new int[MAX_N]; int[] deq = new int[MAX_N]; void solve() { N = ni(); K = ni(); for (int i = 0; i < N; ++i) nums[i] = ni(); int[] val = new int[MAX_N]; int s = 0, t = 0; for (int i = 0; i < N; ++i) { while ((t - s) > 0 && nums[i] <= nums[deq[t - 1]]) { t--; } deq[t++] = i; if (i - K + 1 >= 0) { val[i - K + 1] = nums[deq[s]]; if (deq[s] == i - K + 1) { s++; } } } for (int i = 0; i < N - K + 1; ++i) { out.print(val[i] + (i + 1 == N - K + 1 ? "\n" : " ")); } s = 0; t = 0; for (int i = 0; i < N; ++i) { while (t > s && nums[i] >= nums[deq[t - 1]]) { t--; } deq[t++] = i; if (i - K + 1 >= 0) { val[i - K + 1] = nums[deq[s]]; if (deq[s] == i - K + 1) { s++; } } } for (int i = 0; i < N - K + 1; ++i) { out.print(val[i] + (i + 1 == N - K + 1 ? "\n" : " ")); } } FastScanner in; PrintWriter out; void run() throws IOException { boolean oj; try { oj = ! System.getProperty("user.dir").equals("F:\\java_workspace\\leetcode"); } catch (Exception e) { oj = System.getProperty("ONLINE_JUDGE") != null; } InputStream is = oj ? System.in : new FileInputStream(new File(INPUT)); in = new FastScanner(is); out = new PrintWriter(System.out); long s = System.currentTimeMillis(); solve(); out.flush(); if (!oj){ System.out.println("[" + (System.currentTimeMillis() - s) + "ms]"); } } public boolean more(){ return in.hasNext(); } public int ni(){ return in.nextInt(); } public long nl(){ return in.nextLong(); } public double nd(){ return in.nextDouble(); } public String ns(){ return in.nextString(); } public char nc(){ return in.nextChar(); } class FastScanner { BufferedReader br; StringTokenizer st; boolean hasNext; public FastScanner(InputStream is) throws IOException { br = new BufferedReader(new InputStreamReader(is)); hasNext = true; } public String nextToken() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { hasNext = false; return "##"; } } return st.nextToken(); } String next = null; public boolean hasNext(){ next = nextToken(); return hasNext; } public int nextInt() { if (next == null){ hasNext(); } String more = next; next = null; return Integer.parseInt(more); } public long nextLong() { if (next == null){ hasNext(); } String more = next; next = null; return Long.parseLong(more); } public double nextDouble() { if (next == null){ hasNext(); } String more = next; next = null; return Double.parseDouble(more); } public String nextString(){ if (next == null){ hasNext(); } String more = next; next = null; return more; } public char nextChar(){ if (next == null){ hasNext(); } String more = next; next = null; return more.charAt(0); } } static class ArrayUtils { public static void fill(int[][] f, int value) { for (int i = 0; i < f.length; ++i) { Arrays.fill(f[i], value); } } public static void fill(int[][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } public static void fill(int[][][][] f, int value) { for (int i = 0; i < f.length; ++i) { fill(f[i], value); } } }}
阅读全文
0 0
- 挑战程序竞赛系列(54):4.4 双端队列(1)
- 挑战程序竞赛系列(55):4.4 双端队列(2)
- 挑战程序竞赛系列(56):4.4 双端队列(3)
- 挑战程序竞赛系列(9):2.4优先队列
- 挑战程序竞赛系列(53):4.4 栈
- 挑战程序竞赛系列(81):4.3 LCA(1)
- 挑战程序竞赛系列(1):2.3动态规划
- 挑战程序竞赛系列(82):4.3 LCA(2)
- 挑战程序竞赛系列(4):2.1深度优先搜索
- 挑战程序竞赛系列(5):2.1广度优先搜索
- 挑战程序竞赛系列(6):2.1穷尽搜索
- 挑战程序竞赛系列(10):2.4并查集
- 挑战程序竞赛系列(11):2.5最短路径
- 挑战程序竞赛系列(12):2.5最小生成树
- 挑战程序竞赛系列(13):2.6辗转相除法
- 挑战程序竞赛系列(14):2.6素数
- 挑战程序竞赛系列(15):2.6快速幂运算
- 挑战程序竞赛系列(16):3.1最大化最小值
- javaweb——Struts
- Java高级工程师面试总结
- 关于Eclipse下的SVN下载的java工程无法被识别的解决方法
- //写入与LED交互的日志,和LED显示屏的交互日志
- 2017-09-07 LeetCode_001 Two Sum
- 挑战程序竞赛系列(54):4.4 双端队列(1)
- Switch能否用string做参数?
- 图像滤波器 探究(图示+源码)
- 在Python里创建JSON文件
- xpath helper插件:网页爬虫分析工具
- Tensorflow中的物体识别API的demo实现
- 对软件架构设计的一些总结和理解
- Android音频驱动-ASOC之Control Device创建
- OpenCV2编程手册笔记之 4.4直方图均衡化