《剑指offer》第五十九题(滑动窗口的最大值)
// 面试题59(一):滑动窗口的最大值
// 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,
// 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个
// 滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}, #include <iostream>
#include <vector>
#include <deque> using namespace std; vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> maxInWindows;
if (num.size() >= size && size >= )
{
deque<int> index; for (unsigned int i = ; i < size; ++i)//先找出第一个滑窗里的最大值的坐标,放入队列头
{
while (!index.empty() && num[i] >= num[index.back()])
index.pop_back(); index.push_back(i);
} for (unsigned int i = size; i < num.size(); ++i)//对之后的每个点
{
maxInWindows.push_back(num[index.front()]);//先把队列头放入maxInWindows while (!index.empty() && num[i] >= num[index.back()])//如果队列不为空且当前点大于尾节点,就删除尾节点,直到尾节点不小于当前节点
index.pop_back();
if (!index.empty() && index.front() <= (int)(i - size))//如果队列不为空,且头结点的位置小于当前位置减去滑窗长度,说明这个最大值不再滑窗内了,删除
index.pop_front(); index.push_back(i);//插入当前点的坐标
}
maxInWindows.push_back(num[index.front()]);//最后那个值没在循环中插入maxInWindows,要额外写一句
} return maxInWindows;
} // ====================测试代码====================
void Test(const char* testName, const vector<int>& num, unsigned int size, const vector<int>& expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); vector<int> result = maxInWindows(num, size); vector<int>::const_iterator iterResult = result.begin();
vector<int>::const_iterator iterExpected = expected.begin();
while (iterResult < result.end() && iterExpected < expected.end())
{
if (*iterResult != *iterExpected)
break; ++iterResult;
++iterExpected;
} if (iterResult == result.end() && iterExpected == expected.end())
printf("Passed.\n");
else
printf("FAILED.\n");
} void Test1()
{
int num[] = { , , , , , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = { , , , , , };
vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = ; Test("Test1", vecNumbers, size, vecExpected);
} void Test2()
{
int num[] = { , , -, -, , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = { , , , , , };
vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = ; Test("Test2", vecNumbers, size, vecExpected);
} // 输入数组单调递增
void Test3()
{
int num[] = { , , , , , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = { , , , , };
vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = ; Test("Test3", vecNumbers, size, vecExpected);
} // 输入数组单调递减
void Test4()
{
int num[] = { , , , , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = { , , };
vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = ; Test("Test4", vecNumbers, size, vecExpected);
} // 滑动窗口的大小为1
void Test5()
{
int num[] = { , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = { , , , };
vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = ; Test("Test5", vecNumbers, size, vecExpected);
} // 滑动窗口的大小等于数组的长度
void Test6()
{
int num[] = { , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); int expected[] = { };
vector<int> vecExpected(expected, expected + sizeof(expected) / sizeof(int)); unsigned int size = ; Test("Test6", vecNumbers, size, vecExpected);
} // 滑动窗口的大小为0
void Test7()
{
int num[] = { , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); vector<int> vecExpected; unsigned int size = ; Test("Test7", vecNumbers, size, vecExpected);
} // 滑动窗口的大小大于输入数组的长度
void Test8()
{
int num[] = { , , , };
vector<int> vecNumbers(num, num + sizeof(num) / sizeof(int)); vector<int> vecExpected; unsigned int size = ; Test("Test8", vecNumbers, size, vecExpected);
} // 输入数组为空
void Test9()
{
vector<int> vecNumbers;
vector<int> vecExpected; unsigned int size = ; Test("Test9", vecNumbers, size, vecExpected);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
Test9();
system("pause");
return ;
}
《剑指offer》第五十九题(滑动窗口的最大值)的更多相关文章
- 《剑指offer》第十九题(正则表达式匹配)
// 面试题19:正则表达式匹配 // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.' // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题 ...
- 《剑指offer》第二十九题(顺时针打印矩阵)
// 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...
- 《剑指offer》面试题59 - I. 滑动窗口的最大值
问题描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5 ...
- 剑指Offer(二十九):最小的K个数
剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 《剑指offer》第五十九题(队列的最大值)
// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...
- 《剑指offer》第二十六题(树的子结构)
// 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...
- 《剑指offer》第二十八题(对称的二叉树)
// 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...
- 《剑指offer》第二十四题(反转链表)
// 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...
- 《剑指offer》第二十二题(链表中倒数第k个结点)
// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...
- 《剑指offer》第十八题(删除链表中重复的结点)
// 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...
随机推荐
- kivy Properties
Introduction to Properties¶ Properties are an awesome way to define events and bind to them. Essenti ...
- Linux学习笔记之Linux 让进程在后台可靠运行的几种方法
0x00 概述 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终 ...
- Linux 安装 RabbitMQ 3.7.8 安装部署
Linux 安装 rabbitmq 3.7.8 安装部署 安装 ncurses 1.安装GCC GCC-C++ Openssl等模块 yum -y install make gcc gcc-c++ k ...
- ora-12705解决方法
最近使用instant sqlplus测试时,遇到ora-12705,一开始以为是少了配置,经查是,NLS_LANG设置问题,设置为"SIMPLIFIED CHINESE_CHINA.ZHS ...
- 【题解】Luogu P1648 看守
原题传送门:P1648 看守 这题目让求得的是d维( d <=4 )空间中n个点( 2 <= N <= 1000000 )之间最大的哈曼顿距离 模拟,emm,能拿30分,不错 因为d ...
- Linux 命令梳理
Linux 命令梳理 待梳理命令 nohup 用户管理 useradd 新建用户 sudo useradd {user name} -s /bin/bash -d /data/{user name} ...
- PHP 重置数组为连续数字索引的几种方式
原文链接:https://blog.csdn.net/zhang197093/article/details/78606916 推荐的方式 array_values 方法 这样方式无论对普通数组还是 ...
- 给自己的程序添加BugReport
转载:https://www.easyicon.net/(免费icon) 转载:https://www.codeproject.com/Articles/5260/XCrashReport-Excep ...
- linux如何管理物理内存?
Linux kernel version: 5.0.1 arm64 1.将物理内存划分为若干页,每页的大小为4KiB(可以为8KiB或16KiB),那么如何知道每个页当前是什么情况呢? 那就需要一个结 ...
- bzoj 2527: [Poi2011]Meteors
昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的. (这里n,m,k我就不区分了) 首先一个城市的询问可以很容易的二分 check用树状数组维护区间(区间修改,单点查询的那种) 一次是\(O(n ...