import java.util.LinkedList;
/*
单调队列 滑动窗口
单调队列是这样的一个队列:队列里面的元素是有序的,是递增或者递减
题目:给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k.
要求:f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0,1,...,N-1
问题的另一种描述就是用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值
详情见
@陈利人 http://weibo.com/lirenchen
http://weibo.com/1915548291/z3T4HbRRr
该条微博下有人回复说:
@我是RickyYang:维护一个有k个元素大顶堆,如果每次移出堆的是堆顶,那么将新数替换堆顶,并对堆做调整,
如果移出不是堆顶,则只需将新数和堆顶比较,大的留在堆顶,小的替换移出的数,无需调整堆。最坏的话时间复杂度nlogk,最好n-k+logk (11月6日 08:22)
这应该也是可行的。我的刚开始想到的也是用最大堆。不过稍嫌麻烦的是:“如果移出不是堆顶,则只需将新数和堆顶比较,大的留在堆顶,小的替换移出的数”
这样的话,要记录窗口移动后被移出窗口的那个数,同时“替换移出的数”,要在最大堆执行搜索
单调队列的参考思路:
http://xuyemin520.is-programmer.com/posts/25964
1.首先看插入元素:为了保证队列的递减性,我们在插入元素v的时候,要将队尾的元素和v比较,
如果队尾的元素不大于v,则删除队尾的元素,然后继续将新的队尾的元素与v比较,直到队尾的元素大于v,这个时候我们才将v插入到队尾
2.队尾的删除刚刚已经说了,那么队首的元素什么时候删除呢?
由于我们只需要保存i的前k-1个元素中的最大值,所以当队首的元素的索引或下标小于 i-k+1的时候,
就说明队首的元素对于求f(i)已经没有意义了,因为它已经不在窗里面了。所以当index[队首元素]<i-k+1时,将队首 元素删除
在下面的代码里面,实现队列时,我直接用了LinkedList,因为手工用数组维护一个单调队列要考虑挺多的。现在把重点放在算法的思路上^_^
*/
public class SlidingWindow {
public static void main(String[] args) {
/*
int[] array = { 8, 7, 12, 5, 16, 9, 17, 2, 4, 6 };
int k = 3;
*/
int[] array = { 3, 4, 5, 7, 3, 5, 2, 9 };
int k = 3;
int[] max = maxInWindow(array, k);
for (int i : max) {
System.out.println(i);
}
}
public static int[] maxInWindow(int[] array, int k) {
if (k <= 0 || array == null || array.length == 0) {
System.out.println("invalid input");
return new int[0];
}
int len = array.length;
int[] max = new int[len];
if (k == 1) {
System.arraycopy(array, 0, max, 0, len); //复制一份,不影响原数组
} else {
LinkedList<Item> queue = new LinkedList<Item>();
for (int i = 0; i < len; i++) {
Item curItem = new Item(array[i], i);
if (queue.isEmpty()) {
queue.addLast(curItem);
} else {
Item head = queue.getFirst();
int headIndex = head.getIndex();
//如果队首元素已不在窗口内,则删除
if (headIndex < (i - k + 1)) {
queue.removeFirst();
}
//插入元素
while (!queue.isEmpty()) {
Item tail = queue.getLast();
int tailValue = tail.getValue();
if (tailValue < array[i]) {
queue.removeLast();
if (queue.isEmpty()) {
queue.addLast(curItem);
break;
}
} else if (tailValue > array[i]) {
queue.addLast(curItem);
} else {
break;
}
}
}
//每次操作后,队首元素为当前窗口的最大值
if (!queue.isEmpty()) {
max[i] = queue.getFirst().getValue();
}
}
}
return max;
}
}
class Item {
//数组元素值
private int value;
//数组元素对应的下标
private int index;
public Item(int value, int index) {
this.value = value;
this.index = index;
}
public int getValue() {
return value;
}
public int getIndex() {
return index;
}
}
分享到:
相关推荐
实训商业源码-深蓝健身房瑜伽馆行业小程序V4.5.0全开源解密版-毕业设计.zip
毕业论文-Z-BlogPHP海盗导航主题模板-整站商业源码.zip
基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明,该项目是个人毕设项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指挥8种手势识别源码+数据集+模型+详细项目说明基于pytorch实现中国交通警察指
实训商业源码-在线考试系统源码 学生教师用-毕业设计.zip
实训商业源码-自采集壁纸源码小韩美化版-毕业设计.zip
ANSYS nCode DeaignLife 高级疲劳分析技术.pdf
毕业论文-活动报名 4.1.1+年卡 1.1.3-整站商业源码.zip
BIM和PLM技术在市政工程三维设计中的应用.pdf
内容概要:本文档详细介绍了Python反爬虫技术的各种应对策略,包括基础和高级方法。基础部分涵盖User-Agent伪装、IP代理池、请求频率控制等,其中涉及使用fake_useragent库随机生成User-Agent、设置HTTP/HTTPS代理、通过随机延时模拟正常访问行为。动态页面处理方面,讲解了Selenium和Pyppeteer两种自动化工具的使用,可以用于加载并获取JavaScript渲染后的网页内容。对于验证码问题,提供了OCR识别简单验证码、Selenium模拟滑块验证码操作以及利用第三方平台破解复杂验证码的方法。登录态维持章节介绍了如何通过Session对象保持登录状态,并且演示了Cookie的保存与读取。数据加密对抗部分探讨了JavaScript逆向工程和WebAssembly破解技巧,如使用PyExecJS执行解密脚本。最后,高级反爬绕过策略中提到了WebSocket数据抓取和字体反爬解析,确保能够从各种复杂的网络环境中获取所需数据。 适合人群:有一定Python编程经验,从事数据采集工作的开发人员。 使用场景及目标:①帮助开发者理解并掌握多种反爬虫绕过技术;②为实际项目中的数据抓取任务提供有效的解决方案;③提高爬虫程序的成功率和稳定性。 其他说明:在学习过程中,建议结合具体案例进行实践,同时注意遵守网站的robots协议及相关法律法规,合法合规地进行数据采集活动。
毕业论文-叮咚-外卖餐饮小程序6.1.5 前端+后端-整站商业源码.zip
实训商业源码-抢购秒杀系统V1.0.2 安装更新包-毕业设计.zip
实训商业源码-智答-更好用的语音问答6.0.4-毕业设计.zip
毕业论文-发卡-整站商业源码.zip
Ayla NetWorks:全面探索物联网数据安全和数据隐私.pdf
毕业论文-活动报名小程序-整站商业源码.zip
jquery-1.11.0.min.js(jQuery下载)
实训商业源码-易优cms建筑项目施工装饰工程公司网站模板源码-毕业设计.zip
实训商业源码-新麦客服 1.2.8-毕业设计.zip
实训商业源码-在线创建GitHub资源下载链接-毕业设计.zip
实训商业源码-柚子KTV 1.5.9-毕业设计.zip