《剑指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 ...
随机推荐
- php开启xdebug扩展
1.下载Xdebug(先看php下的ext文件夹(C:\xampp\php\ext)下有没有php_xdebug.dll文件,如果有的话,就不用下了.) 到目前为止,Xdebug的最新版本为2.7.0 ...
- 获取ip,获取客户端浏览器,获取客户端访问操作系统,获取客户端访问设备
/** * 获取ip */ public static function getIp() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CL ...
- Golang切片的三种简单使用方式及区别
概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...
- JS截取字符串中数字
今天项目中需要在一个字符串中截取一个数字,然后数字参与运算.搜了一下,有好多好用的方式截取字符串. 1,使用parseInt() var str ="4500元"; var num ...
- PyCharm配置Python3开发环境
PyCharm配置Python3开发环境 PyCharm的开发环境是配置在对应的工程中: 一.创建一个Project 工具栏:New - New Project 建议指定一个专门的目录 ,用来存放py ...
- 一句话说清楚cache和buffer
我们说真正掌握和理解一个定义或者概念或者技术点最好的方式就是能够直观的展现它是什么样的,或者像什么样的,关于cache和buffer,刚刚看到一个极为显而易见的类比解释. buffer就像弹簧,用于减 ...
- PHP 重置数组为连续数字索引的几种方式
原文链接:https://blog.csdn.net/zhang197093/article/details/78606916 推荐的方式 array_values 方法 这样方式无论对普通数组还是 ...
- 20145319 《网络渗透》免考—API拦截技术
20145319 <网络渗透>免考-API拦截技术 概述 本次实验在window环境下进行,主要通过编写hook代码和注入程序,将我们的hook代码通过dll文件的形式注入到目标中,拦截其 ...
- OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树
描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头 ...
- shell脚本中如何实现scp传输?
示例脚本如下: #! /bin/sh expect -c " spawn scp -r /home/jello/jello.txt jello@110.110.110.110:/home/j ...