求解接雨水问题代码出现的vector空指针引用运行时错误
接雨水问题代码的运行时错误修复
错误原因分析
- 未初始化
left和right的容量:你定义的两个vector是空的,直接通过下标访问(比如left[0])会访问到未分配的内存,触发空指针引用错误。 - 第一个循环索引越界:初始循环从i=0开始,此时
left[i-1]等价于left[-1],属于非法访问数组下标。
修正后的代码
int trap(vector<int>& height) { int n = height.size(); if (n == 0) return 0; // 处理空数组的边界情况 vector<int> left(n); vector<int> right(n); left[0] = height[0]; for (int i = 1; i < n; i++) { // 从i=1开始,避免访问left[-1] left[i] = max(left[i-1], height[i]); } right[n-1] = height[n-1]; for (int i = n-2; i >= 0; i--) { right[i] = max(right[i+1], height[i]); } int ans = 0; for (int i = 0; i < n; i++) { ans += min(left[i], right[i]) - height[i]; } return ans; }
关键修正点说明
- 初始化vector容量:
vector<int> left(n);和vector<int> right(n);确保两个vector拥有和输入数组相同长度的内存空间,下标访问合法。 - 调整第一个循环起始位置:从i=1开始,因为i=0的left值已经提前赋值,同时避免了i=0时访问
left[-1]的非法操作。 - 新增空数组判断:如果输入的height是空数组,直接返回0,避免后续代码处理n=0时的越界问题。
内容的提问来源于stack exchange,提问作者Samarth Saxena
相关产品推荐
相关产品推荐

