Sliding Window Maximum

Easy C++

Enunciado do problema

Dado um array nums, há uma janela deslizante de tamanho k que está se movendo da esquerda da matriz para a direita. Você só pode ver os números k na janela. Cada vez que a janela deslizante se move para a direita por uma posição. Retorne a janela deslizante máxima.

Questões importantes

Posso ter números negativos no meu vetor de entrada? sim

Solução

A ideia de resolver este problema é sempre manter o maior número encontrado como primeiro em uma janela deslizante. Isso é possível usando uma deque, mantendo um os índices do array. Em cada loop, primeiro verifique se o elemento frontal da janela deslizante é válido, menor que a posição atual menos k. Segundo, verifique se o número atual é maior que o da fila, em caso positivo, remova a parte traseira até que nenhum elemento menor que o atual seja encontrado. Adicione o elemento atual à parte traseira e adicione a frente como resposta para esta posição atual da janela.

vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    deque<int> indexes;
    vector<int> result;

    for(int i=0;i<nums.size();i++){

        if(!indexes.empty() && indexes.front()<=i-k){
            indexes.pop_front();
        }
        while(!indexes.empty() && nums[i]>nums[indexes.back()]){
            indexes.pop_back();
        }
        indexes.push_back(i);

        if(i>=k-1){
            result.push_back(nums[indexes.front()]);
        }
    }

    return result;
}

Complexidade de tempo: O(n)

Complexidade de espaço: O(n)


question from LeetCode