题目:Sliding Window Maximum

给定一个数组和滑动窗口的大小,窗口从开始位置每次向后滑动一格,找出每次窗口的最大值;

思路:

记录当前窗口的最大值下标,每次移动一格时,最小下标会移出窗口,邻接着的最大下标会移入窗口;

因此,每次窗口移动时,首先比较移入的是否比当前最大值还大,是则更新最大值;然后判断移出的是否是最大值,是则重新找最大值。

vector<int> LeetCode::maxSlidingWindow(vector<int>& nums, int k){
    vector<int>arr;
    if (!nums.size())return arr;
    int max = 0;
    for (size_t i = 1; i < k && i < nums.size(); i++){//找第一个最大值
        if (nums.at(i) >= nums.at(max))max = i;
    }
    arr.push_back(nums.at(max));
    if (k >= nums.size())return arr;
    for (size_t i = k; i < nums.size(); i++){
        if (nums.at(i) >= nums.at(max))max = i;//更新新窗口的最大值
        else if (i - k >= max){//旧窗口的最大值移出去了,且新窗口的最大值小于移出去的最大值
            //找新的最大值
            ++max;
            for (size_t j = max + 1; j <= i; ++j){
                if (nums.at(j) >= nums.at(max))max = j;
            }
        }
        arr.push_back(nums.at(max));
    }
    return arr;
}