剑指offer之滑动窗口的最大值

1 问题

给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值,列如,数组{2,3,4,2,6,2,5,1}的滑动窗口大小是3,一起6个滑动窗口,分别是{4,4,6,6,5}

2 分析

2,3,4,2,6,2,5,1
我们这里可以用双端队列,滑动窗口是3,我们先找出前3个数字里面的最大值,放在双端队列的头,然后依次向右滑动,确保每次滑动后队列的头是最大值。

3 代码实现

#include <iostream>
#include <vector>
#include <deque>

using namespace std;

vector<int> maxWindows(const vector<int> &nums, int size)
{
vector<int> maxWindows;
if (size <= 0 || nums.size() <= 0 || (nums.size() < size))
{
return maxWindows;
}
deque<int> indexs;
for (int i = 0; i < size; ++i)
{
while (indexs.size() > 0 && nums[i] > nums[indexs.back()])
{
indexs.pop_back();
}
indexs.push_back(i);
}
for (int i = size; i < nums.size(); ++i)
{
maxWindows.push_back(nums[indexs.front()]);
while (indexs.size() > 0 && nums[i] > nums[indexs.back()])
{
indexs.pop_back();
}
while (indexs.size() > 0 && (i - indexs.front() >= size))
{
indexs.pop_front();
}
indexs.push_back(i);
}
maxWindows.push_back(nums[indexs.front()]);
return maxWindows;
}

int main()
{
vector<int>  nums;
nums.push_back(2);
nums.push_back(3);
nums.push_back(4);
nums.push_back(2);
nums.push_back(6);
nums.push_back(5);
nums.push_back(2);
nums.push_back(1);
vector<int>  result;
result = maxWindows(nums, 3);

if (result.size() > 0)
{
for (int i = 0; i < result.size(); ++i)
std::cout << result[i] << std::endl;
}
return 0;
}

4 运行结果

4
4
6
6
6
5

5 总结

在一个数组里面,通过双端队列(qedue)求最大值

    std::deque<int> indexs;
    std::vector<int> nums;
    nums.push_back(1);
    nums.push_back(3);
    nums.push_back(2);
    nums.push_back(5);
    nums.push_back(4);
    for (int i = 0; i < nums.size(); ++i)
    {
while (indexs.size() > 0 && nums[i] > nums[indexs.back()])
{
indexs.pop_back();
}
indexs.push_back(i);
    }
    std::cout << "maxValue is " << nums[indexs.front()] << std::endl;
(0)

相关推荐

  • C 代码简化之道

    我是极简主义者,崇尚简洁明快的代码风格,这也可能是我不喜欢Java全家桶的原因--当然我说的简洁是要建立在不降低可读性的前提下,即不影响代码本身的表现力.如果为求代码精简而让代码晦涩艰深同样不可取. ...

  • 【剑指Offer】数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 解法1 最直接的思路,计算base的 ...

  • 【剑指Offer】链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数 ...

  • 【剑指Offer】反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用n ...

  • 剑指 Offer 14- I. 剪绳子

    我服了.动态规划杀我. 可以说一说解决动态规划的思路(只做了两三道就总结了emmm) 1.识别动态规划问题 --重叠子问题:大问题可以分为一个个子问题.和分治策略分割的子问题不同(分治问题的子问题是相 ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...

  • 剑指 Offer 30. 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例:MinStack minStack = ne ...

  • 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  • 每日一题 剑指offer(包含min函数的栈)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 每日一题 剑指offer(从上往下打印二叉树)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...