leet code 4 Median of Two Sorted Arrays
题意:给定两个有序数组nums1和nums2,大小分别为m和n,返回两个已排序数组的中位数,时间复杂度为O(log (m+n))。
分析:中位数的求法:若数组长度为奇数,则为中间数;若数组长度为偶数,则为中间两数和/2。
对于两个有序数组,如果使用归并排序合成一个数组,时间复杂度为O(m+n),不可行。
此时需要利用中位数的位置:
从0开始的中位数下标mid0 = (m+n) /2 。
(m+n奇数时是中位数下标,偶数时是中间靠右第一个数下标)
设找到中位数时,在nums1数组上的下标为i,nums2数组上的下标为j,i+j=mid0-1。而nums1[i] <= nums2[j+1], nums2[j] <= nums1[i+1], j+1、i+1都在坐标范围内。
i可能的值为-1(不取nums1)、0、1…m-1。
i=-1的情况单独判断。i从m-1位置开始,若nums1[i] > nums2[j+1],往左边跳,i = i/2,缓存位置pre;若nums1[j] > nums2[i+1],往右边跳,i = (i + pre) /2。
代码Java版:
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int size1 = nums1.length, size2 = nums2.length;
int size = size1 + size2;
if (size == 0) return 0.0;
boolean flag = ((size & 1) == 1);
//偶数需要中间两个数
//奇数只需要中位数
int mid0 = size >> 1; //从0开始的中位数下标
//若为奇数, 是中间数的下标;若为偶数,是中间靠右第一个数的下标。
//让程序始终遍历数组长度最短的
return size1 <= size2 ? calcV(nums1, nums2, size1, size2, mid0, flag) :
calcV(nums2, nums1, size2, size1, mid0, flag);
}
public double calcV(int nums1