LeetCode求解两个有序数组的中位数时出现stl_vector.h空指针运行时错误
错误产生原因
- 核心问题是你声明了空的
std::vector<int> nums3后直接使用[]运算符赋值:C++标准库的vector不会在使用下标访问时自动扩容,[]仅允许访问已经被初始化的有效下标位置,你对空vector直接写nums3[k++] = xxx本质是访问未申请的内存区域,属于未定义行为,因此触发了运行时报错。 - 额外存在逻辑隐患:最终返回中位数时直接对两个int值做整数除法,会丢失小数精度,比如元素和为3时整数除法得到1而非正确的1.5。
修复方案
最简单的修改方式是把所有下标赋值替换为push_back()方法,push_back()会自动处理vector的内存扩容,不需要手动维护下标k,修改后的代码如下:
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(); int n = nums2.size(); vector<int> nums3; int i = 0, j = 0; while(i < m && j < n) { if(nums1[i] <= nums2[j]) nums3.push_back(nums1[i++]); else nums3.push_back(nums2[j++]); } while(i < m) nums3.push_back(nums1[i++]); while(j < n) nums3.push_back(nums2[j++]); int len = nums3.size(); if(len % 2 == 0) return (nums3[len/2] + nums3[len/2 - 1]) / 2.0; else return nums3[len/2]; } };
如果要保留原有下标赋值的写法,也可以在声明nums3时预先分配空间:vector<int> nums3(m + n);,后续的下标赋值逻辑就可以正常运行。
内容的提问来源于stack exchange,提问作者shm_csgo
相关产品推荐
相关产品推荐

