• Leecode no.4: 找两个顺序数组的中位数


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

    }

    }
  • 相关阅读:
    HDU1852 Beijing 2008(快速幂+特殊公式)
    HihoCoder 1570 : 小Hi与法阵(简单几何)
    【转】反素数
    【整理】线段树30题
    SPOJcot2 Count on a tree II (树上莫队)
    【总结】曼哈顿距离转切比雪夫距离
    【初识】树上分块
    基于Tablestore Tunnel的数据复制实战
    【New Feature】阿里云快照服务技术解析
    基于日志服务的GrowthHacking(1):数据埋点和采集(APP、Web、邮件、短信、二维码埋点技术)
  • 原文地址:https://www.cnblogs.com/ttaall/p/14031418.html
Copyright © 2020-2023  润新知