Sliding window 最大问题中的分段错误

Segmentation fault in Sliding window maximum problem

我尝试在 Hackerrank(Deque-stl). I followed the algorithm given on this link 上解决 Sliding window maximum using deque 问题。我不想复制解决方案,所以我尝试编写自己的解决方案。但是我的代码给了我 "segmentation fault",我不明白我的代码有什么问题。谁能解释一下我的代码中的错误?

void printKMax(int arr[], int n, int k)
{
    deque<int> q;
    int l=0,j=k-1;
    q.push_back(l);
    while(j!=n)
    {
        for(;l<j;)
        {
            while((arr[l+1]>arr[q.back()])&&(!q.empty()))
                q.pop_back();
            q.push_back(++l);
        }
        cout<<arr[q.front()]<<" ";
        j++;
        while(q.front()<=j-k)
            q.pop_front();
    }
    cout<<"\n";
}

我不确定算法是否正确,但有 2 行可能会出现分段错误:

while((arr[l+1]>arr[q.back()])&&(!q.empty()))

原因是您在 q.empty() 之前检查 q.back() 如果它为空,结果将是未定义的行为。将其更改为:

while((!q.empty())&&(arr[l+1]>arr[q.back()]))

这样它将首先检查它是否为空,如果它为空则在检查 q.back() 并给出分段错误之前中断循环。

第二行是:

while(q.front()<=j-k)
    q.pop_front();

我想你应该检查它是否像第一行一样是空的。