《剑指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 ...
随机推荐
- Linux内核启动流程与模块机制
本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...
- 【题解】Luogu P3871 [TJOI2010]中位数
平衡树板题 原题传送门 这道题要用Splay,我博客里有对Splay的详细介绍 每次加入一个数,把数插入平衡树中 并且要记录一共有多少个数 每次查询就查询平衡树中第(总数-1)/2+1个数 十分暴力 ...
- python简说(七)元组,集合
一.元组 元组也是一个list,但是它的值不能改变 定义元组的时候,只有一个元素,后面得加逗号 oracle_info = (123,) 二.集合 1.集合天生就可以去重,集合是无序的 2.#交集 r ...
- python简说(三)字典
一.字典 stu_info = {"name": "王志华", "age": 18, "addr": "北京& ...
- Jenkins 总结
步骤: 1,安装Jenkins 2,运行Jenkins: java -jar jenkins.war --httpPort=8888 httpPort指的就是Jenkins所使用的http端口,这里指 ...
- How to Rerun Failed Tests in JUnit?
该帖转自其他出处 Sometimes due to some temporarily problems such as connection problems, server problems, br ...
- topcoder srm 705 div1 -3
1.设有一个字母表$T$,对于一个单词$w$,若对于任意的$0\leq i< |w|-1$,满足$w_{i}$在$T$中的排名小于等于$w_{i+1}$在$T$中的排名,则称$s$在$T$中是合 ...
- Python3基础 list [] 创建空列表
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Docker:Service
Prerequisites Install Docker version 1.13 or higher. Get Docker Compose. On Docker for Mac and Docke ...
- ComponentOne 2017 V1 发布
在刚刚庆祝完Visual Studio20周年之后,我们迎来了ComponentOne 2017年第一个重要的版本. ComponentOne Studio与Visual Studio 2017配合发 ...