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());
    }
}