算法总结之 在两个长度相等的排序数组中找到上中位数

题目描述: arr1  和 arr2   长度都为N   求两个数组中所有数的上中位数

要求 时间复杂度 O(logN)  额外空间复杂度O(1)

这道题目的方法比较好玩:

这两个数组如下表示:

arr1[start1....end1]     arr2[start2...end2]

如果start1==start2  那么也有start2==end2   此时元素总个数是2个,上中位数为最小的那个

如果start1!=start2  令mid1={start1+end1}/2      mid1={start2+end2}/2

进而分情况

情况一、 如果arr1[mid1] == arr2[mid2]

如果两个数组长度为奇数或者偶数,那么arr1[mid1] == arr2[mid2]=上中位数

情况二、如果arr1[mid1] >arr2[mid2]

如果长度为奇数、(假设为5)arr1的第三个数>arr2的第三个数  此时上中位数只能是从arr1的{1,2,3}和arr2的{3,4,5}的共同的上中位数找

如果长度为偶数,(假设为4)arr1的第二个数>arr2的第二个数  此时上中位数只能是从arr1的{1,2}和arr2的{3,4}的共同的上中位数找

如果arr1[mid1] <arr2[mid2]情况完全一致  请读者自行推理

废话不多说,上代码:

package TT;

public class Test12 {

    public  static int getUpMedian(int[] arr1 , int[] arr2){

        if(arr1==null || arr2==null || arr1.length != arr2.length){
            throw new RuntimeException("hi,babay.are you ok?");
        }

        int start1 =0;
        int end1 = arr1.length-1;

        int start2=0;
        int end2 = arr2.length-1;

        int mid1 =0;
        int mid2 =0;

        int offset = 0;

        while(start1 < end1){
            mid1 = (start1+end1)/2;
            mid2 = (start2+end2)/2;

            offset = ((end1 - start1+1)&1)^1;
            if(arr1[mid1] > arr2[mid2]){
                end1 = mid1;
                start2=mid2+offset;
            }else if(arr1[mid1]<arr2[mid2]){
                start1 = mid1 + offset;
                end2 = mid2;

            }else {
                return arr1[mid1];
            }

        }

        return Math.min(arr1[start1], arr2[start2]);

    }

    public static void main(String[] args){

           int[] a1 = new int[4];
           int[] a2 = new int[4];

          a1[0]=0;  a1[1]=1;  a1[2]=2; a1[3]=3;
          a2[0]=4;  a2[1]=5;  a2[2]=5; a2[3]=6;

          int c = getUpMedian(a1,a2);

          System.out.println(c);

    }

}

结果:

时间: 2024-10-04 19:28:30

算法总结之 在两个长度相等的排序数组中找到上中位数的相关文章

【递归打卡1】在两个长度相等的排序数组中找到上中位数

[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数.要求时间复杂度O(logN),空间复杂度O(1) [举例] 例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]. 总共8个数,则中位数就是第 4 小的数,为 3. 例如 arr1 = [0,1,2],arr2 = [3,4,5]. 总共6个数,则中位数就是第 3 小的数,为 2. [难度] 中 解答 这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

【转】在两个长度相等的排序数组中找到上中位数

[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数.要求时间复杂度O(logN),空间复杂度O(1) [举例] 例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]. 总共8个数,则中位数就是第 4 小的数,为 3. 例如 arr1 = [0,1,2],arr2 = [3,4,5]. 总共6个数,则中位数就是第 3 小的数,为 2. [难度] 中 解答 这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

9.27 在两个排序数组中找到第K小的数

[题目]: 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第K小的数 举例: arr1=[1, 2, 3, 4, 5],arr2=[3, 4, 5],k=1 1是所有数中第1小的数,所以返回1 arr1=[1, 2, 3],arr2=[3, 4, 5, 6],k=4 3是所有数中第4小的数,所以返回3 [要求]: 如果arr1的长度为N,arr2的长度为M,时间复杂度清达到O(log(min{M, N})),额外空间复杂度为O(1) 题目来源:左程云老师<程序员代码面试指南

算法与数据结构总结1 二分查找与旋转排序数组

一. 二分搜索(Binary Search)模板及其理解 1.通用模板,解决start, end, mid, <(<=), >(>=)等问题 http://www.lintcode.com/en/problem/binary-search/ class Solution { public: /** * @param nums: The integer array. * @param target: Target number to find. * @return: The firs

算法系列15天速成——第二天 七大经典排序【中】

原文:算法系列15天速成--第二天 七大经典排序[中] 首先感谢朋友们对第一篇文章的鼎力支持,感动中.......  今天说的是选择排序,包括“直接选择排序”和“堆排序”. 话说上次“冒泡排序”被快排虐了,而且“快排”赢得了内库的重用,众兄弟自然眼红,非要找快排一比高下. 这不今天就来了两兄弟找快排算账. 1.直接选择排序: 先上图: 说实话,直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小排个序, 那小孩首先会在这么多玩具中找到最小的放在第一位,然后找到次小的放在第二位

编程算法 - 数字在排序数组中出现的次数 代码(C)

数字在排序数组中出现的次数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 统计一个数字在排序数组中出现的次数. 通过折半查找, 找到首次出现的位置, 再找到末次出现的位置, 相减即可. 时间复杂度O(logn). 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #inc

【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】

[026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for anot

一个数组中找到满足和为sum的两个数

如果考虑hashmap直接O(n)的速度, 如果不行,就先排序,两头指针很好推理,关键是 a[beg] +a[end]>sum,意思就是说a[end]太大了,最小的数的都不满足,所以排除a[end] 绝知此事要躬行 #include<iostream>#include<algorithm>using namespace std; bool find(int *a,int sum,int len,int &ans1,int &ans2){    int *beg