// 面试题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》第五十九题(滑动窗口的最大值)的更多相关文章

  1. 《剑指offer》第十九题(正则表达式匹配)

    // 面试题19:正则表达式匹配 // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.' // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题 ...

  2. 《剑指offer》第二十九题(顺时针打印矩阵)

    // 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...

  3. 《剑指offer》面试题59 - I. 滑动窗口的最大值

    问题描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5 ...

  4. 剑指Offer(二十九):最小的K个数

    剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  5. 《剑指offer》第五十九题(队列的最大值)

    // 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...

  6. 《剑指offer》第二十六题(树的子结构)

    // 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...

  7. 《剑指offer》第二十八题(对称的二叉树)

    // 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...

  8. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

  9. 《剑指offer》第二十二题(链表中倒数第k个结点)

    // 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...

  10. 《剑指offer》第十八题(删除链表中重复的结点)

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

随机推荐

  1. Jira客户端

    github地址 https://github.com/rcarz/jira-client 使用 1)私服 <!-- https://mvnrepository.com/artifact/net ...

  2. Centos7.3+uwsgi+Nginx部署Django程序

    1. 安装Python,这里我用的是阿里云的centos7.3,自带python2,所以,此步略过,具体安装Python可Google. 2. 安装uwsgi,如果安装失败的话首先,我的Python解 ...

  3. Python2的一些问题及解决办法

    1. 无法注释中文的解决办法 # -*- coding:utf8 -*- # 添加这一行就行了 from django.contrib import admin from myapp.models i ...

  4. bzoj2595 / P4294 [WC2008]游览计划

    P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...

  5. 成绩统计程序(Java)

    我的程序: package day20181018;/** * 成绩统计系统 * @author Administrator */import java.util.Scanner;//提供计算机直接扫 ...

  6. 存根类(stub) 是什么意思?有什么作用?(转)

    存根类是一个类,它实现了一个接口,但是实现后的每个方法都是空的.  它的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法.但是一个类从业务来说,可能只需要其中一两个方法.   如 ...

  7. mysql 用存储过程插入11位 随机数

    BEGIN #Routine body goes here... ; ); ); ); ); ); ); ); ); ); ); ); ); ) DEFAULT ''; ); ); WHILE row ...

  8. applyColorMap()研究(如果我对现有的colormap不满意,那么如何具体来做)

    cv::applyColorMap()能够实现预定义的伪彩色,这个是众所周知的事情. 并且和matlab提供的很相近 除了这些预置的变换,如果我想实现新的变换,需要做LUT变换     cv::Mat ...

  9. JS、JAVA刷题和C刷题的一个很重要的区别

    就是最近在做树方面的题时,发现JS和JAVA刷题和C刷题的一个很重要的区别就是传入null的区别 当遍历的时候,C传参数时可以传进去null的指针,因为递归进去,出来时,指针还是指着那个地方 但是JS ...

  10. eclipse启动时发生的Initializing Java Tooling错误

    eclipse在启动发生An internal error occurred during: "Initializing Java Tooling". java.lang.Null ...