package com.example.demo.leecode;
/**
* 找出两个数组的中位数
* @Date 2020/11/24
* @author Tang
* 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
*
* 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
*
* 你可以假设 nums1 和 nums2 不会同时为空。
*/
public class MedianOfTwoArrays {
boolean ifOu = true;
int[] array1;
int[] array2;
int index1 = 0;
int index2 = 0;
public MedianOfTwoArrays(int[] array1, int[] array2){
this.array1 = array1;
this.array2 = array2;
if((array1.length + array2.length) % 2 == 1){
ifOu = false;
}
}
/**
* 方式2 用两个指针 从小到大找到中间那个数
*/
private double execute2(){
int index = 0;
double value = 0;
double temp = 0;
int middle = (array1.length + array2.length) / 2 + 1;
while(index < middle){
//如果提前有人到头了
if(index1 > array1.length-1 || index2 > array2.length-1){
break;
}
//value第一次赋值时特殊算
if(index == 0){
if(array1[index1] <= array2[index2]){
value = array1[index1];
index1++;
}else{
value = array2[index2];
index2++;
}
}else if(array1[index1] <= array2[index2]){
//value = ifOu ? (value + array1[index1]) / 2 : array1[index1];
temp = value;
value = array1[index1];
index1++;
}else{
//value = ifOu ? (value + array1[index1]) / 2 : array1[index1];
temp = value;
value = array2[index2];
index2++;
}
index++;
}
//如果没到中位的位置,index1就已经到头了
while(index < middle && index1 > array1.length - 1){
temp = value;
value = array2[index2];
index++;
index2++;
}
//如果没到中位的位置,index2就已经到头了
while(index < middle && index2 > array2.length - 1){
temp = value;
value = array1[index1];
index++;
index1++;
}
return ifOu ? (temp + value)/ 2 : value;
}
/**
* 方法一 合成一个数组 直接取中位数
* @return
*/
private double execute(){
//合并成一个数组
int[] newArray = new int[array1.length+array2.length];
int index = 0;
for(int i = 0; i < newArray.length; i++){
//如果其中一个数组到头了就break
if(index1 > array1.length-1 || index2 > array2.length-1){
//index = i;
break;
}
if(array1[index1] <= array2[index2]){
newArray[index] = array1[index1];
index1++;
}else{
newArray[index] = array2[index2];
index2++;
}
index++;
}
while(index1 < array1.length){
//将array1的剩余元素赋过来
newArray[index] = array1[index1];
index++;
index1++;
}
while(index2 < array2.length){
//将array2的剩余元素付过来
newArray[index] = array2[index2];
index++;
index2++;
}
int middle = index / 2 - 1;
if(index % 2 == 1){
return newArray[middle + 1];
}
double value = newArray[middle] + newArray[middle+1];
return value / 2;
}
public static void main(String[] args) {
int[] array1 = {1,2,3,4};
int[] array2 = {3,4,4,5};
MedianOfTwoArrays medianOfTwoArrays = new MedianOfTwoArrays(array1,array2);
System.out.println(medianOfTwoArrays.execute2());
System.out.println(medianOfTwoArrays.execute());
}
}