4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
这道题本机上各种解法都没有任何问题,但是提交一直报heap—buff-overflow,但是没有堆栈超出啊,唉
一下是两种解法
int num=nums1Size+nums2Size;
int count=num/2+1;
int result,i=0,j=0,value1=0,value2=0;
while(count--){
if(nums1[i]<=nums2[j]&&i<nums1Size){
value2=value1;
value1=nums1[i];
i++;
}else if(nums2[j]<nums1[i]&&j<nums2Size){
value2=value1;
value1=nums2[j];
j++;
}
}
if(num%2==1){
return value1;;
}else
{
return (value1+value2+0.0)/2;
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int num=nums1Size+nums2Size;
int count=num/2;
int result,i=0,j=0,value1=0,value2=0;
while(count--){
if(nums1[i]<=nums2[j]&&i<nums1Size){
value1=nums1[i];
i++;
}else if(nums2[j]<nums1[i]&&j<nums2Size){
value1=nums2[j];
j++;
}
}
if(i==nums1Size){
value2=nums2[j];
}else if(j==nums2Size){
value2=nums1[i];
}else{
if(nums1[i]<nums2[j]){
value2=nums1[i];
}else{
value2=nums2[j];
}
}
if(num%2==1){
return value2;;
}else{
return (value1+value2+0.0)/2;
}
这里附上别人的可行代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int cernterSite = 0;
int i = 0;
int j = 0;
int k = 0;
double preValue = 0;
double curValue = 0;
cernterSite = (nums1Size + nums2Size)/2;
for(k = 0; k <= cernterSite; k++){
if(i < nums1Size && j < nums2Size){
if(*(nums1 + i) > *(nums2 + j)){
preValue = curValue;
curValue = *(nums2 + j);
j++;
continue;
}else{
preValue = curValue;
curValue = *(nums1 + i);
i++;
continue;
}
}
if(j < nums2Size){
preValue = curValue;
curValue = *(nums2 + j);
j++;
continue;
}
if(i < nums1Size){
preValue = curValue;
curValue = *(nums1 + i);
i++;
continue;
}
}
if((nums1Size + nums2Size)%2){
return curValue;
}else{
return (preValue+curValue)/2;
}
}
数组改成指针方式也不行
总结
以后碰见这种有两个限定值的问题,应该采用一下的方式
循环(
if(i,j都满足){}
if(i满足){}
if(j满足){}
)
这样就不会报任何内存的错误了