代码之家  ›  专栏  ›  技术社区  ›  Nikhil Kumar

运行时错误:向0x6030000000d0添加无符号偏移量溢出到0x6030000000cc(stl_vector.h)

  •  -1
  • Nikhil Kumar  · 技术社区  · 1 年前

    问题名称:山脉阵列中的峰值指数

    该问题需要找到山脉阵列中的峰值元素的索引。峰值元素被定义为大于其相邻元素的元素。该阵列保证具有山脉图案。

    这样: arr[0] < arr[1] < ... < arr[i - 1] < arr[i] & arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 哪里 i 是所需的索引。

    以下是我的代码的简化版本:

    class Solution {
    public:
        int peakIndexInMountainArray(vector<int>& arr) {
            int left = 0, right = arr.size() - 1;
            int mid;
            while (left <= right) {
                mid = left + (right - left) / 2;
                if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1]) {
                    return mid;
                } else if (arr[mid] < arr[mid + 1]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
            return -1;
        }  
    };
    
    

    我在上面尝试了一些测试用例,很少能正常工作,但当我使用输入时 {3, 5, 3, 2, 0} ,则代码会触发运行时错误。 runtime error: addition of unsigned offset to 0x6030000000d0 overflowed to 0x6030000000cc (stl_vector.h)

    我可以在自己的编译器上运行它,但在提交代码后,Leetcode上出现了这个错误。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Ted Lyngmo    1 年前

    你从不检查 mid 0 在访问之前 arr[mid-1] 你从不检查 mid arr.size() - 1 在访问之前 arr[mid+1] 。这两种故障都会导致访问越界。

    在访问之前添加检查应使其按照预期设计工作。

    int peakIndexInMountainArray(const std::vector<int>& arr) {
        int left = 0, right = arr.size();
        int mid;
        while (left < right) {
            mid = (left + right) / 2;
    
            bool low = (mid == 0) || (arr[mid] > arr[mid - 1]);
    //                 ^^^^^^^^^^
            bool high = (mid == (arr.size() - 1)) || (arr[mid] > arr[mid + 1]);
    //                  ^^^^^^^^^^^^^^^^^^^^^^^^^
            if (low && high) {
                return mid;
            } else if (low) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return -1;
    }