leetcode 239. 滑动窗口最大值
暴力解法是一种简单直接的方法,虽然效率较低,但可以帮助你更好地理解问题的逻辑。以下是使用暴力解法解决“滑动窗口最大值”问题的 C++ 实现。
暴力解法的思路
-
遍历每个滑动窗口:
- 使用一个外层循环,从数组的起始位置开始,逐步移动窗口的起始位置。
- 每次移动一个位置,形成一个新的滑动窗口。
-
找到当前窗口的最大值:
- 使用一个内层循环,遍历当前窗口内的所有元素,找到最大值。
-
存储最大值:
- 将当前窗口的最大值存储到结果数组中。
-
终止条件:
- 当窗口的右边界超出数组范围时,停止遍历。
C++ 代码实现
#include <vector>
#include <algorithm>
using namespace std;class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;int n = nums.size();// 遍历每个滑动窗口for (int i = 0; i <= n - k; ++i) {int maxNum = INT_MIN; // 初始化当前窗口的最大值为最小整数// 遍历当前窗口内的所有元素for (int j = i; j < i + k; ++j) {maxNum = max(maxNum, nums[j]); // 更新最大值}// 将当前窗口的最大值加入结果数组result.push_back(maxNum);}return result;}
};
代码解释
-
外层循环:
for (int i = 0; i <= n - k; ++i)
:遍历每个可能的滑动窗口的起始位置i
。i
的范围是从0
到n - k
,确保窗口的右边界不超过数组的大小。
-
内层循环:
for (int j = i; j < i + k; ++j)
:遍历当前窗口内的所有元素。maxNum = max(maxNum, nums[j])
:更新当前窗口的最大值。
-
存储最大值:
result.push_back(maxNum)
:将当前窗口的最大值加入结果数组。
-
返回结果:
- 最终返回结果数组
result
。
- 最终返回结果数组
时间复杂度
- 外层循环: 遍历每个可能的滑动窗口,时间复杂度是 O(n - k + 1)。
- 内层循环: 每个窗口内遍历
k
个元素,时间复杂度是 O(k)。 - 总时间复杂度: O((n - k + 1) * k),即 O(n * k)。
空间复杂度
- 结果数组: 存储每个窗口的最大值,空间复杂度是 O(n - k + 1)。
示例运行
假设输入数组是 [1,3,-1,-3,5,3,6,7]
,窗口大小是 k = 3
:
- 第一个窗口
[1,3,-1]
,最大值是3
。 - 第二个窗口
[3,-1,-3]
,最大值是3
。 - 第三个窗口
[-1,-3,5]
,最大值是5
。 - 第四个窗口
[-3,5,3]
,最大值是5
。 - 第五个窗口
[5,3,6]
,最大值是6
。 - 第六个窗口
[3,6,7]
,最大值是7
。
最终结果是 [3,3,5,5,6,7]
。
总结
暴力解法虽然简单易懂,但效率较低,适合小规模数据。对于大规模数据,建议使用双端队列的优化方法,时间复杂度可以优化到 O(n)。如果你对暴力解法还有任何疑问,或者想了解更多优化方法,随时问我哦!