滑动窗口(C++,Java)
滑动窗口(C++,Java)
滑动窗口给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 -1 - 5 6 7],k 为 。窗口位置 最小值 最大值
[1 -1] - 5 6 7 -1
1 [ -1 -] 5 6 7 -
滑动窗口(C++,Java)
给定一个大小为 n≤106 的数组。
有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。
你只能在窗口中看到 k 个数字。
每次滑动窗口向右移动一个位置。
以下是一个例子:
该数组为 [1 -1 - 5 6 7],k 为 。
窗口位置 最小值 最大值 [1 -1] - 5 6 7 -1 1 [ -1 -] 5 6 7 - 1 [-1 - 5] 6 7 - 5 1 -1 [- 5 ] 6 7 - 5 1 -1 - [5 6] 7 6 1 -1 - 5 [ 6 7] 7 你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。
输入格式 输入包含两行。
第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。
第二行有 n 个整数,代表数组的具体数值。
同行数据之间用空格隔开。
输出格式 输出包含两个。
第一行输出,从左至右,每个位置滑动窗口中的最小值。
第二行输出,从左至右,每个位置滑动窗口中的最大值。
输入样例: 8 1 -1 - 5 6 7 输出样例: -1 - - - 5 5 6 7
提交代码
C++
代码语言:javascript代码运行次数:0运行复制#include<iostream>
using namespace std;
ct int = 1000010;
int a[], q[], hh, tt = -1;
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; ++ i) // 这个题要注意的是 q队列里面存放的是位置
{
scanf ("%d", &a[i]); // 先求的是最小值
if (i - k + 1 > q[hh]) ++hh; // 如果最小值的位置已经滑出窗口了 然后就
// ++ hh代表这个数已经没了
while (hh <= tt && a[i] <= a[q[tt]]) -- tt; // 先确保队列里面有数字
// 然后如果新来的数字要小于 队列里面的最小值
// 那么--tt 就代表当前队列的最小值去掉
q[++ tt] = i; // 把新来的数字放到队列中
if (i + 1 >= k) printf ("%d ", a[q[hh]]); // 当前队列的长度已经满足k了
// 就可以把对首的元素输出出来
}
puts("");
int hh = 0, tt = -1;
for (int i = 0; i < n; ++ i)
{
if (i - k + 1 > q[hh]) ++ hh;
while (hh <= tt && a[i] >= a[q[tt]]) -- tt;
q[++ tt] = i;
if (i + 1 >= k) printf("%d ", a[q[hh]]);
}
return 0;
}
Java
代码语言:javascript代码运行次数:0运行复制import java.io.*;
public class Main
{
final static int = 1000010;
static int [] a = new int [];
static int [] q = new int [];
static int hh = 0, tt = -1;
public static void main(String[] args) throws IOException
{
int n, k;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter());
String [] str = reader.readLine().split(" ");
n = Integer.parseInt(str[0]);
k = Integer.parseInt(str[1]);
str = reader.readLine().split(" ");
for (int i = 0; i < n; ++ i) a[i] = Integer.parseInt(str[i]);
// for (int i = 0; i < n; ++ i)
// {
// if (hh <= tt && i - k + 1 > q[hh]) ++ hh;
// while (hh <= tt && a[i] <= a[q[hh]]) -- tt;
// q[++ tt] = i;
// if (i + 1 >= k) out.write(a[q[hh]]+" ");
// }
for(int i = 0; i < n; i ++)
{
if(hh <= tt && i - q[hh] + 1 > k) hh++;//判断队头是否已经滑出窗口
while(hh <= tt && a[q[tt]] >= a[i]) tt--;//出队
q[++tt] = i;//入队
if(i >= k - 1) out.write(a[q[hh]]+" ");
}
out.write("\n");
hh = 0;
tt = -1;
// for (int i = 0; i < n; ++ i)
// {
// if (hh <= tt && i - k + 1 > q[hh]) ++ hh;
// while (hh <= tt && a[i] >= a[q[hh]]) -- tt;
// q[++ tt] = i;
// if (i + 1 >= k) out.write(a[q[hh]]+" ");
// }
for(int i = 0; i < n; i ++)
{
if(hh <= tt && i - q[hh] + 1 > k) hh++;//判断队头是否已经滑出窗口
while(hh <= tt && a[q[tt]] <= a[i]) tt--;//出队
q[++tt] = i;//入队
if(i >= k - 1) out.write(a[q[hh]]+" ");
}
out.flush();
();
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent 删除队列数组javac++int #感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-19 13:21:02
推荐阅读
留言与评论(共有 18 条评论) |
本站网友 深圳龙园意境 | 15分钟前 发表 |
从左至右 | |
本站网友 汕头二手房出售 | 29分钟前 发表 |
a[q[hh]]); // 当前队列的长度已经满足k了 // 就可以把对首的元素输出出来 } puts(""); int hh = 0 | |
本站网友 新发现餐厅 | 17分钟前 发表 |
同行数据之间用空格隔开 | |
本站网友 北京心理咨询 | 26分钟前 发表 |
滑动窗口(C++ | |
本站网友 俄罗斯蓝猫 | 19分钟前 发表 |
原始发表:2025-01-20 | |
本站网友 网络电话论坛 | 24分钟前 发表 |
代表数组的具体数值 | |
本站网友 晒后如何修复 | 6分钟前 发表 |
窗口位置 最小值 最大值 [1 -1] - 5 6 7 -1 1 [ -1 -] 5 6 7 - 1 [-1 - 5] 6 7 - 5 1 -1 [- 5 ] 6 7 - 5 1 -1 - [5 6] 7 6 1 -1 - 5 [ 6 7] 7 你的任务是确定滑动窗口位于每个位置时 | |
本站网友 松浦观江国际 | 11分钟前 发表 |
k 为 | |
本站网友 梦见打架斗殴 | 10分钟前 发表 |
以下是一个例子:该数组为 [1 -1 - 5 6 7] | |
本站网友 以后你不是我的 | 13分钟前 发表 |
第一行包含两个整数 n 和 k | |
本站网友 高通骁龙430 | 5分钟前 发表 |
输入样例: 8 1 -1 - 5 6 7 输出样例: -1 - - - 5 5 6 7提交代码C++代码语言:javascript代码运行次数:0运行复制#include<iostream> using namespace std; ct int = 1000010; int a[] | |
本站网友 南山图书馆 | 0秒前 发表 |
如有侵权请联系 cloudcommunity@tencent 删除前往查看队列数组javac++int | |
本站网友 薄荷怎么吃 | 3分钟前 发表 |
从左至右 | |
本站网友 过午不食法 | 30分钟前 发表 |
tt = -1; for (int i = 0; i < n; ++ i) { if (i - k + 1 > q[hh]) ++ hh; while (hh <= tt && a[i] >= a[q[tt]]) -- tt; q[++ tt] = i; if (i + 1 >= k) printf("%d " | |
本站网友 陈威旭 | 30分钟前 发表 |
代表数组的具体数值 | |
本站网友 农村经济合作组织 | 1分钟前 发表 |
窗口中的最大值和最小值 | |
本站网友 补办身份证 | 29分钟前 发表 |
tt = -1; int main() { int n |