地址
https://leetcode.com/problems/median-of-two-sorted-arrays/description/
题目
Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
题解
看题目时间复杂度可以知道这题是要在两个数组间进行二分。
假设选定i和j满足$i+j=k$,k代表中位数的位置。
如果$a[i]<=b[j]$,则中位数不在a数组前i个数中,删除a数列前i个数。反之$a[i]>b[j]$,同理。证明方法 反证法,自己想想就知道了。
当然删除不是真的删除,打个标记而已,不然时间复杂度炸了。
ps:好久没做题了,想到思路后还写了好久,然后又debug好久,真是丢人。代码写的真是丑陋。
代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& a, vector<int>& b) {
int n=a.size(),m=b.size(),c=(n+m)&1,k=(n+m+1)/2;
int sa=-1,sb=-1;
n--,m--;
while(1)
{
if(sa==n&&c)
return b[sb+k]*1.0;
else if(sa==n)
return (b[sb+k]+b[sb+k+1])/2.0;
if(sb==m&&c)
return a[sa+k]*1.0;
else if(sb==m)
return (a[sa+k]+a[sa+k+1])/2.0;
if(k==1)
{
if(c)
return min(a[sa+1],b[sb+1])*1.0;
else
{
if(a[sa+1]<b[sb+1])
{
if(sa+2<=n)
return (min(a[sa+2],b[sb+1])+a[sa+1])/2.0;
else
return (a[sa+1]+b[sb+1])/2.0;
}
else
{
if(sb+2<=m)
return (min(a[sa+1],b[sb+2])+b[sb+1])/2.0;
return (a[sa+1]+b[sb+1])/2.0;
}
}
}
int i=min(k/2,n-sa),j=k-i;
if(j>m-sb)
j=m-sb,i=k-j;
if(a[sa+i]<=b[sb+j])
k-=i,sa+=i;
else
k-=j,sb+=j;
}
}
};