运行时错误:将无符号偏移量添加到 0x603000000040 溢出到 0x603000000034 (stl_vector.h)

Faz*_*ani 4 c++ runtime-error deque

我正在解决滑动窗口最大值问题,但我在 Leetcode 上收到以下错误,但它在我的本地编译器上运行 [VSCode]

第 1034 行:Char 34:运行时错误:将无符号偏移量添加到 0x603000000040 溢出到 0x603000000034 (stl_vector.h)
摘要:UndefinedBehaviorSanitizer:未定义行为/usr/bin/../lib/gcc/x86_64-linux-gnu/9/ ../../../../include/c++/9/bits/stl_vector.h:1043:34

这是代码:

#include <deque>

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& A, int k) {
        
        int _max = INT_MIN;
        vector<int> ans;
        for (int i = 0; i < k; ++i)
        {
            _max = max(_max, A[i]);
        }
        if (k == A.size()){
            return {_max};
        }
        
        ans.push_back(_max);
        deque<int> dq;
        dq.push_back(_max);

        for (int i = k; i < A.size(); ++i)
        {
            if (dq.empty())
            {
                dq.push_back(i);
                _max = A[i];
            }
            else
            {
                while (!dq.empty() && A[dq.front()] < A[i])
                {
                    dq.pop_front();
                }
                if (dq.empty())
                {
                    _max = A[i];
                }
                else
                {
                    _max = max(_max, A[i]);
                }
                dq.push_front(A[i]);
                ans.push_back(_max);
            }
        }

        return ans;
    }
};
Run Code Online (Sandbox Code Playgroud)

CPP*_*CPP 5

看起来问题就在这里:A[dq.front()] < A[i];

正如我在运行时看到的那样,dq.front()其值-3不太好,因为它是负索引。真正的崩溃就在这里A[dq.front()]。所以你的代码中有一个编程错误。

看起来您也在这里推送了错误的索引:dq.push_front(A[i]),这意味着输入确实有负值,这是您没有预料到的。

也许您想写dq.push_front(i)而不是dq.push_front(A[i]).

固定程序对您来说如下所示:

#include <deque>

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& A, int k) {
        
        int _max = INT_MIN;
        vector<int> ans;
        for (int i = 0; i < k; ++i)
        {
            _max = max(_max, A[i]);
        }
        if (k == A.size()){
            return {_max};
        }
        
        ans.push_back(_max);
        deque<int> dq;
        dq.push_back(_max);

        for (int i = k; i < A.size(); ++i)
        {
            if (dq.empty())
            {
                dq.push_back(i);
                _max = A[i];
            }
            else
            {
                while (!dq.empty() && A[dq.front()] < A[i])
                {
                    dq.pop_front();
                }
                if (dq.empty())
                {
                    _max = A[i];
                }
                else
                {
                    _max = max(_max, A[i]);
                }
                dq.push_front(i);
                ans.push_back(_max);
            }
        }

        return ans;
    }
};
Run Code Online (Sandbox Code Playgroud)