学习心得:
最近一直在刷leetcode,虽然刷的慢,但学的东西真的不少。上一篇学习心得我有讲过之前一直出现了内存溢出的情况,但一直未能解决。在刷到第四题:寻找两个数组的中位数时,我再次遇到了相同的问题。但这次我终于能找出原因了。先贴出错误的提示:
LeetCode 使用了AddressSanitizer检查是否存在内存非法访问,它的问题主要是说我们对于数组的访问越界了。这个确实很头疼。
当时上网查了很多,我在下面这篇文章中得到了一些启示。文章里说赋值加减的操作可能会导致数组的越界。通俗来说,往往错误就在于i++,等自增或访问下一个数组元素的操作,这些操作可能顺序颠倒,也可能在循环的最后一次多了一次访问操作,导致数组的越界。
https://blog.csdn.net/huihui_8/article/details/100052677
在知道大概的原因之后,我在代码里加了好几个判断语句,避免出现越界情况。索性最后真的通过了。附上代码:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int size_left = (nums1Size + nums2Size + 1)/2;
int i = 0, j = size_left-i;
double max_left,min_right;
if(nums1Size > nums2Size){
int *temp,t;
temp = nums1;
nums1 = nums2;
nums2 = temp;
t = nums1Size;
nums1Size = nums2Size;
nums2Size = t;
}
if(nums1Size==0 && nums2Size==0)
return 0;
else if(nums1Size==0){
max_left = nums2[(nums2Size-1)/2];
min_right = nums2[nums2Size/2];
}
else{
while(i<=nums1Size){
if(i == nums1Size){
if(j==0)
max_left = nums1[i-1];
else
max_left = nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1];
min_right = nums2[j];
break;
}
else if(nums1[i]>=nums2[j-1]){
if(i==0){
if(j==nums2Size)
min_right = nums1[i];
else
min_right = nums1[i]<nums2[j]?nums1[i]:nums2[j];
max_left = nums2[j-1];
break;
}
max_left = nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1];
min_right = nums1[i]<nums2[j]?nums1[i]:nums2[j];
break;
}
else{
i++;
j = size_left-i;
}
}
}
if((nums1Size + nums2Size)%2 == 0)
return (max_left+min_right)/2;
else
return max_left;
}