当前位置: 首页 > java >正文

滑动窗口之二(优先队列)

原本滑动窗口的板子用的是数组和双指针模拟,我嫌麻烦还不好懂找了双端队列。但其实还是不太好使,比如今天的这道题就处理起来很麻烦。但是如果用优先队列的话就可以一直保证整个窗口是有序的,只需判断一下是否在窗口内即可。但是!优先队列的时间是会劣于双端队列的,反正这个5e5的数据是过了。下面看题!


题中要找的最小不管是最大的最小还是什么一定是建立在有序的基础上。要想找两个数的差最小,那么这两个数一定是相邻的。第一部就是进行排序。既然题上说了是在固定大小为k的序列中进行查找,那么就是一个滑动窗口的思想。维护固定长度的窗口,每次找当前窗口中最小值然后与之前进行比较。窗口中的最大值一定就是左边界减去右边界,这个没什么变化的。主要就是找最小值。想要一直维护此窗口中差值的最小值不妨先将这个窗口的值全部压进优先队列中,然后每次窗口滑动都将最新的值压进去。在使用最小值(堆顶)的时候需要判断一下此时这个堆顶还在不在窗口中。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fi first
#define se second
#define pii pair<int, int>
const int N = 1e6+1;
int a[N];
void solve()
{priority_queue<pii, vector<pii>, greater<pii>> q;//前面窗口中相邻差(min值),后边存下标int n,k;cin >> n >> k;for(int i=1; i<=n; i++) cin >> a[i];sort(a+1,a+1+n);int ans = 1e18;for(int i=2; i<=k; i++) q.push({a[i]-a[i-1],i});//先将第一个窗口压进去for(int i=k; i<=n; i++)//将第一个窗口重复压进去,为了判断是否刚好第一个窗口就是最小值{q.push({a[i]-a[i-1],i});while(!q.empty()&&i-k>=q.top().se)//如果此时堆顶已经不在窗口中就要弹出去q.pop();ans=min(ans,q.top().fi*(a[i]-a[i-k+1]));//每次对它进行更新}cout << ans;
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t=1;
//	cin >> t;while(t--) solve();
}

http://www.xdnf.cn/news/6517.html

相关文章:

  • 关于PID的几种整定方法
  • 【Fifty Project - D26】
  • 第四章:文件内容查看
  • 使用nps配置内网穿透加域名解析
  • 中国版 Cursor?腾讯推出 AI 编程助手 CodeBuddy,重新定义编程体验
  • 项目变更管理
  • 怎样用 esProc 实现连续区间的差集运算
  • 2023年河南CCPC->F题
  • 从零实现一个高并发内存池 - 3
  • 数字孪生技术于航天航空领域的应用探索
  • LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案
  • 远程实时控制安卓模拟器技术scrcpy
  • Linux云计算训练营笔记day09(MySQL数据库)
  • 多系统环境下,如何构建高效的主数据管理体系?
  • Vue2在子组件上使用v-model实现数据的双向绑定、.sync修饰符
  • 图深度学习、EMD和VMD详解
  • 受控组件和非受控组件的适用场景分别是什么?
  • AMGX里“One-ring“和“Two-ring“概念和解释
  • Ubuntu操作合集
  • 典型的**N+1查询问题**
  • 使用CMake中的configure_file命令自动生成项目版本信息
  • 【好用的工具】连服务器进入base指令
  • X-Ray,XRD,XRF,XPS有什么区别?
  • 【文件上传漏洞】
  • 面试从微前端拓展到iframe是如何通信的
  • 初始化一个Springboot项目
  • 基于正点原子探索者开发板的简易音乐播放器
  • doris节点数量规划
  • 设计并应用一个IIR-ButterWorth-Filter的例子
  • 前端工程化