寻找两个有序数组的中位数(median_of_two_sorted_arrays)
LeetCode第四题
详情:
给定两个大小为 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我自己的解法:
public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len = nums1.length+nums2.length;
int medIndex,medIndex1;
double median=0;
if(len%2==0){
//中位数下标 如果是偶数个则有两个下标
medIndex = len /2;
medIndex1 = medIndex+1;
//i和j分别是nums1和nums2的下标
for (int i = 0,j=0; i+j < len; ) {
//以大小为基准按顺序遍历
if((i<nums1.length&&j<nums2.length&&nums1[i]<nums2[j])|| (j==nums2.length&&i!=nums1.length)){
//如果第一个数组的第i个数小于第二个数组的第j个数字
//
if(i+j+1==medIndex){
median+=nums1[i];
}
if(i+j+1==medIndex1){
median+=nums1[i];
break;
}
i++;
}else if((i<nums1.length&&j<nums2.length&&nums2[j]<=nums1[i]) || (j!=nums2.length&&i==nums1.length)){
if(i+j+1==medIndex){
median+=nums2[j];
}
if(i+j+1==medIndex1){
median+=nums2[j];
break;
}
j++;
}
}
median /=2.0;
}else{
//奇数个只有一个中位数下标
//中位数下标
// double test = len/2+0.5;
medIndex = new Double(len/2.0+0.5).intValue();
for (int i = 0,j=0; i+j < len; ) {
if((i<nums1.length&&j<nums2.length&&nums1[i]<nums2[j])|| (j==nums2.length&&i!=nums1.length)){
if(i+j+1==medIndex){
median+=nums1[i];
break;
}
i++;
}else if((i<nums1.length&&j<nums2.length&&nums2[j]<=nums1[i]) || (j!=nums2.length&&i==nums1.length)){
if(i+j+1==medIndex){
median+=nums2[j];
break;
}
j++;
}
}
}
return median;
}
public static void main(String[] args) {
int[] nums1= new int[]{1,3};
int[] nums2 = new int[]{2};
// int[] nums1= new int[]{1,2};
// int[] nums2 = new int[]{3,4};
System.out.println(new Solution().findMedianSortedArrays(nums1,nums2));
}
}
官方链接及解法
public class Official {
public double findMedianSortedArrays(int[] A, int[] B) {
//初始化数组长度
int m = A.length;
int n = B.length;
//确保m<=n
if(m>n){//to ensure m<=n
int[] temp = A;
A=B;
B=temp;
int tmp = m;
m=n;
n=tmp;
}
//halfLen应该是中心点位置
//iMax是较短数组的长度
int iMin=0,iMax=m,halfLen = (m+n+1)/2;
while (iMin<=iMax){
//i代表较短数组的中心点
int i = (iMin + iMax)/2;
//j代表较短数组中心点与整体中心点的距离
int j = halfLen-i;
if(i<iMax&&B[j-1]>A[i]){
iMin = i+1;//i is too small
}else if (i>iMin&&A[i-1 ]>B[j]){
iMax = i-1; //i is too big
}else {
//i is perfect
int maxLeft=0;
if(i==0){
maxLeft = B[j-1];
}else if (j==0){
maxLeft = A[i-1];
}else {
maxLeft = Math.max(A[i-1],B[j-1]);
}
//如果数组长度为单数
if((m+n)%2==1){
return maxLeft;
}
int minRight = 0;
if(i==m){
minRight = B[j];
}else if (j==n){
minRight = A[i];
}else {
minRight = Math.min(B[j],A[i]);
}
return (maxLeft+minRight)/2.0;
}
}
return 0.0;
}
public static void main(String[] args) {
int[] nums1= new int[]{1,3};
int[] nums2 = new int[]{2};
// int[] nums1= new int[]{1,2};
// int[] nums2 = new int[]{3,4};
System.out.println(new Official().findMedianSortedArrays(nums1,nums2));
}
}