面试题59 - I:滑动窗口的最大值(C++)
2021-01-27 10:13
标签:ems turn 时间 循环 判断 font 思路 span https 题目地址:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 给定一个数组 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 滑动窗口的位置 最大值 暴力法:扫描每个滑动窗口的所有数字并找出其中的最大值,即直接移动滑动窗口,每次统计滑动窗口中的最大值,并将其放入到数组arr中即可。需要注意的是遍历循环的上限是nums.size()-k+1,因为滑动窗口如果移动到此位置时,刚好将整个数组遍历完毕。 动态规划:对暴力法进行优化可得到动态规划方法。 双端队列:本题的关键在于如何从滑动窗口中动态获取每一个最大值,定义队列始终保证队列中的元素均处在当前滑动窗口范围内且元素由队头至队尾呈单调递减的状态,只把有可能成为滑动窗口最大值的数值存入双端队列deque。定义一个双端队列dq,用来保存有可能成为滑动窗口最大值的数字的下标,便于从队尾删除不可能为滑动窗口最大值的候选元素,另外滑动窗口的最大值总是出现在队首,在存入一个数字的下标之前,首先判断队列里已有数字是否小于待存入的数字。如果小于,那么这些数字已经不可能是滑动窗口的最大值,将他们依次从队尾删除。同时,如果队头的数字已经从窗口里滑出,那么滑出的数字也需要从队头删除。具体步骤如下: 暴力法 动态规划 双端队列 参考文章 https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/c-dequeshi-xian-dan-diao-dui-lie-by-zhengguanyu/ 面试题59 - I:滑动窗口的最大值(C++) 标签:ems turn 时间 循环 判断 font 思路 span https 原文地址:https://www.cnblogs.com/wzw0625/p/12846021.html题目描述
nums
和滑动窗口的大小 k
,请找出所有滑动窗口里的最大值。题目示例
输出: [3,3,5,5,6,7]
解释:
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7解题思路
程序源码
class Solution {
public:
vectorint> maxSlidingWindow(vectorint>& nums, int k) {
if(nums.size() == 0) return nums; //nums.empty()
int len = nums.size() - k + 1; //输出数组长度大小
vectorint> arr;
for(int i = 0; i )
{
int max_num = nums[i];
for(int j = i + 1; j )
{
max_num = max(nums[j], max_num);
}
arr.push_back(max_num);
}
return arr;
}
};
class Solution {
public:
vectorint> maxSlidingWindow(vectorint>& nums, int k) {
if(nums.size() == 0) return nums;
vectorint> dp(nums.size() - k + 1, INT_MIN);
for(int i = 0; i )
{
dp[0] = max(dp[0], nums[i]);
}
for(int i = 1; i )
{
if(nums[i - 1] 1])
{
dp[i] = max(dp[i - 1], nums[i + k - 1]); //转入下一个滑动窗口,即比较dp[0]和nums[3]
}
else //比如dp[1]=3与nums[1]=3
{
for(int j = i; j )
{
dp[i] = max(dp[i], nums[j]); //比如滑动窗口[-1,-3,5]与dp[2]
}
}
}
return dp;
}
};
class Solution {
public:
vectorint> maxSlidingWindow(vectorint>& nums, int k) {
if(nums.size() == 0) return nums;
vectorint> arr;
dequeint> dq;
for(int i = 0; i )
{
while(!dq.empty() && nums[i] > nums[dq.back()]) dq.pop_back();
if(!dq.empty() && dq.front() k)) dq.pop_front();
dq.push_back(i);
if(i >= k - 1) arr.push_back(nums[dq.front()]);
}
return arr;
/* vector
文章标题:面试题59 - I:滑动窗口的最大值(C++)
文章链接:http://soscw.com/index.php/essay/47698.html