Leetcode典型题解答和分析、归纳和汇总——T239(滑动窗口的最大值)

问题描述:

给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,你只可以看到在滑动窗口内的K个数字。滑动窗口每次向右只能移动一位,返回滑动窗口中的最大值。

问题分析:

如果是只要找某个区间内的最大值,那这个过程就比较简单,直接采用遍历的算法即可,但是这个题目要求我们找一个滑动窗口内内的最大值,这就需要我们进行分类讨论了。

【1】如果上一个窗口的最大值在最左边,则下一个窗口内的所有值都需要遍历查找;

【2】如果上一个窗口的最大值不在最左边,则只需要将这个最大值与新加入窗口的值进行比较大小即可。

class Solution{
  public:
  int findMax(vector<int>& nums, int left,int right)
  {
    int max = nums[left];
    for(int i=left+1;i<=right;i++)
    {
      if(nums[i]>max)  max = nums[i];
    }
    return max;
  }

  vector<int> maxSlidingWindow(vector<int>& nums, int k)
  {
    int len = nums.size();
    vector<int> res;
    if(len==0||k>len)  return res;

    int left = 0;
    int right = k-1; //窗口的值
    int curMax =0;
    int subMax = 0;
    int i = left;
    curMax = findMax(nums,left,right);  //找滑动窗口中的最大值
    
    res.push_back(curMax);
    while(right<nums.size()-1)
    {
      right++;
      left++;
      if(curMax == nums[left-1])  //如果当前最大值为最左边位置的值
      {
        subMax = findMax(nums,left,right);  //找出最大值
      }

      else subMax = curMax;  //其他情况就是保存当前最大值

      curMax = subMax>nums[right]?subMax:nums[right];
      res.push_back(curMax);
    }
    return res;
  }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值