话不多说,直接上手,双重循环
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
if(nums.size()<=1)
{
return nums;
}
vector<int> result;
for(int i=0;i<=nums.size()-k;i++)
{
int max=nums[i];
for(int j=i+1;j<i+k;j++)
{
if(nums[j]>max)
{
max=nums[j];
}
}
result.push_back(max);
}
return result;
}
};
肯定过不了,那就浅浅优化一下,每个滑动窗口的值并不是都需要全部重新找最大值,如下图
滑动窗口每次只是向右移动一次,可能就会出现 这种情况,上一次的最大值仍在新的滑动窗口内,只需要比较这个最大的和新进的即可。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
int max_index = 0;
for (int i = 1; i < k; i++)
{
if (nums[i] > nums[max_index])
{
max_index = i;
}
}
result.push_back(nums[max_index]);
for (int i = 1; i <= nums.size() - k; i++)
{
if (max_index < i || max_index >= i + k)//判断最大值的下标是否在新的滑动窗口内
{
max_index = i;
for (int j = i+1; j < i + k ; j++)
{
if (nums[j] > nums[max_index])
{
max_index = j;
}
}
}
else//在
{
if (nums[max_index] < nums[i + k - 1])
{
max_index = i + k - 1;
}
}
result.push_back(nums[max_index]);
}
return result;
}
};
意料之中,还是不通过,看题解,呃,用了优先队列,思想是一模一样的,还是要熟悉C++的STL库,就不必自己一个一个写了。代码拉过来看一下吧。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
priority_queue<pair<int, int>> q;
for (int i = 0; i < k; ++i) {
q.emplace(nums[i], i);
}
vector<int> ans = {q.top().first};
for (int i = k; i < n; ++i) {
q.emplace(nums[i], i);
while (q.top().second <= i - k) {
q.pop();
}
ans.push_back(q.top().first);
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/sliding-window-maximum/solutions/543426/hua-dong-chuang-kou-zui-da-zhi-by-leetco-ki6m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其他就算了,智力有限,笑死,就是不想看。