• [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到上中位数(二分)


    题目描述

    • 给定两个有序(升序)数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。
    • 根据例子,上中位数指若有两个中位数,则较小的那一个是上中位数。

    题解

    • 分类讨论。结合使用二分,两个数组分别维护l、r、mid指针。
      • arr1[mid1]=arr2[mid2],直接返回结果
      • arr1[mid1]>arr2[mid2],分别去掉两个数组不可能的部分,两个数组剩余部分(一定要保持l2-l1与r2-r1相等!)继续二分。
      • arr1[mid1]<arr2[mid2],同上
    • 时间复杂度O(logN),空间复杂度O(1)

    代码

    public class Main {
    	public static void main(String args[]) {
    		int[] arr1= {1,2,3,4};
    		int[] arr2= {3,4,5,6};
    		int midian=getUpMidian(arr1,arr2);
    		System.out.println(midian);
    	}
    	
    	public static int getUpMidian(int arr1[],int arr2[]) {
    		if(arr1==null||arr2==null||arr1.length!=arr2.length) {
    			throw new RuntimeException("Array is invaild!");
    		}
    		if(arr1.length==1) {
    			return arr1[0]<arr2[0]?arr1[0]:arr2[0];
    		}
    		int l1=0;
    		int l2=l1;
    		int r1=arr2.length-1;
    		int r2=r1;
    		while(l1<r1) {
    			boolean oddFlag=(r1-l1+1)%2==1?true:false;
    			int mid1=(l1+r1)/2;
    			int mid2=(l2+r2)/2;
    			if(arr1[mid1]==arr2[mid2]) {
    				return arr1[mid1];
    			}
    			else if(arr1[mid1]>arr2[mid2]) {
    				r1=mid1;
    				l2=oddFlag?mid2:mid2+1;
    			}
    			else {
    				r2=mid2;
    				l1=oddFlag?mid1:mid1+1;
    			}
    		}
    		return arr1[l1];
    	}
    }
    
  • 相关阅读:
    讯飞语音合成 简单使用
    android UI 操作 不要在子线程中操作UI
    把信送给加西亚
    android 二维码 扫描,生成,竖屏
    Android App签名(为apk签名)
    android 蓝牙 通信 bluetooth
    Android 蓝牙开发基本流程
    Android 使用 Application 简单介绍
    几个比较特殊的目录
    FHS目录配置下,常见的几个问题及解答
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10902639.html
Copyright © 2020-2023  润新知