代码改变世界

剑指 Offer 59 - I. 滑动窗口的最大值

2020-11-20 00:04  woshihuangrulin  阅读(76)  评论(0编辑  收藏  举报

这道题目使用暴力方法很简单的就能够解决掉,但是使用动态规划的方法利用前一次的结果可以大大加速,

if 滑窗向右移动时丢弃掉的如果不是最大值则只需要判定新加入的值和上一轮的最大值之间的关系,如果新加入的值大,则新的滑窗最大值是新加入的值,否则是上一个滑窗的最大值,

else 重新计算滑窗的最大值,注意数组中可能存在重复数字

代码如下:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if (nums.empty()) {
            return nums;
        }
        
        vector<int> result(nums.size() - k + 1, 0);
        

        auto find_max = [&nums, &k](int i) {
            int max_value = nums[i];
            for (int j = i + 1; j < i + k; j++) {
                if (max_value < nums[j]) {
                    max_value = nums[j];
                }
            }
            return max_value;
        };
        
        result[0] = find_max(0);
        for (int i = 1; i < static_cast<int>(result.size()); i++) {
            if (nums[i-1] < result[i-1]) {
                if (nums[i + k - 1] > result[i-1]) {
                    result[i] = nums[i + k - 1];
                }
                else {
                    result[i] = result[i-1];
                }
            }
            else {
                result[i] = find_max(i);
            }
        }

        return result;
    }
};