题目
寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
问题提示
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- 10^6 <= nums1[i], nums2[i] <= 10^6
初写的问题代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
//分别得出两数组的长度
int m=nums1.size();
int n=nums2.size();
int tmp=0;//合并后的当前序数
double med=0;
int mc=0,nc=0;//两数组的当前指针
//分别从两数组取出当前更小或相同的数,直到长度和的一半
while(tmp<=(m+n)/2){
if(nums1[mc]<=nums2[nc]){
med=nums1[mc++];
tmp++;
}
else{
med=nums2[nc++];
tmp++;
}
}
//如果是偶数,需加上下一个数
if((m+n)%2==0){
if(nums1[mc]<=nums2[nc])
med+=nums1[mc];
else
med+=nums2[nc];
med=med/2;
}
//存在两个空数组、一个空数组的情况
return med;
}
};
LeetCode报错:
测试用例:
[ ]
[1]
报错原因:
执行出错 Line 1034: Char 9: runtime error: reference binding to null
pointer of type ‘int’ (stl_vector.h) SUMMARY:
UndefinedBehaviorSanitizer: undefined-behavior
/usr/bin/…/lib/gcc/x86_64-linux-gnu/9/…/…/…/…/include/c++/9/bits/stl_vector.h:1043:9
程序中具体原因:
空指针问题,越界报错
修改方向:
- 精炼代码
- 防止越界
修改之后的代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
//分别得出两数组的长度
const int m=nums1.size();
const int n=nums2.size();
int mc=0,nc=0;//两数组的当前指针
int med=0,val=0;
//分别从两数组取出当前更小或相同的数,直到长度和的一半
while((mc+nc)<(m+n)/2+1 ){
med=val;//记录偶数情况下的前一个数
//防止越界报错
if(mc==m){
val=nums2[nc++];
continue;
}
if(nc==n){
val=nums1[mc++];
continue;
}
if(nums1[mc]<=nums2[nc]){
val=nums1[mc++];
}
else{
val=nums2[nc++];
}
}
//如果是偶数,需加上下一个数
if((m+n)%2==0){
return(double)(val+med)/2;
}
//存在两个空数组、一个空数组的情况
return val;
}
};