zoukankan      html  css  js  c++  java
  • [程序员代码面试指南]第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系统启动过程分析
    android的logcat 用法整理
    git 使用详解(10) 远程分支
    android的logcat 用法整理
    android Binder工作流程
    android Binder工作流程
    git log 小结
    linux patch 命令小结
    windows 中 \r\n 区别于 类unix中的\n 疑问 迎刃而解
    Mysql Error Code : 1436 Thread stack overrun
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10902639.html
Copyright © 2011-2022 走看看