zoukankan      html  css  js  c++  java
  • 递归算法(1)

    1. 当数组长度为偶数时,它们各自的中位数下标为:mid1=(n-1)/2;  mid2=(n-1)/2;

     当arr1[mid1] < arr2[mid2]时,目标中位数一定在arr1[mid1+1,,,,,,n]和 arr2[0,,,,,mid2]之间,不可能在其余区间;因为目标中位数的下标为n-1, 假如arr2[0,,,,mid-1]所有数全部小于arr1[mid1], 将这些小于数全部放到arr1[mid1]之后,目标中位数的最小的下标也在mid1+1处。

    2. 当数组长度为奇数时,各自中位数下标与上面相同;

    当arr1[mid1] < arr2[mid2]时,目标中位数在一定arr1[mid1,,,,,,n]和 arr2[0,,,,,mid2]之间,不可能在其余区间;

    偶数奇数区间的区别,是由于取各自中位数时,偶数要少一位,奇数在中间。

    3. 当arr1[mid1] < arr2[mid2]时,两个数组相反即可。

    public static int getUpMedian(int[] arr1, int[] arr2) {
    if(arr1 == null || arr2 == null )
    return -1;
    // 开始寻找
    return find(arr1, 0, arr1.length - 1, arr2, 0, arr2.length - 1);
    }
    也可以⽤用迭代来做,反⽽而更更加简单,迭代版本如下:
    public static int find(int[] arr1, int l1, int r1, int[] arr2, int l2, int
    r2) {
    int mid1 = l1 + (r1 - l1) / 2;
    int mid2 = l2 + (r2 - l2) / 2;
    // 表示数组只剩下⼀一个数,把两个数组中较⼩小的数返回去
    if (l1 >= r1) {
    return Math.min(arr1[l1], arr2[l2]);
    }
    // 元素个数为奇数,则offset为0,为偶数则 offset 为 1
    int offset = ((r1 - l1 + 1) & 1) ^ 1;// ⽤用位运算⽐比较快
    if (arr1[mid1] < arr2[mid2]) {
    return find(arr1, mid1+offset, r1, arr2, l2, mid2);
    } else if (arr1[mid1] > arr2[mid2]) {
    return find(arr1, l1, mid1, arr2, mid2 + offset, r2);
    } else {
    return arr1[mid1];// 返回 arr2[mid2]也可以。
    }
    }
    View Code
    public int getUpMedian2(int[] arr1, int[] arr2) {
    if (arr1 == null || arr2 == null) {
    return -1;
    }
    int l1 = 0;
    int r1 = arr1.length - 1;
    int l2 = 0;
    int r2 = arr2.length - 1;
    int mid1 = 0;
    int mid2 = 0;
    int offset = 0;
    while (l1 < r1) {
    mid1 = l1 + (r1 - l1) / 2;
    mid2 = l2 + (r2 - l2) / 2;
    offset = ((r1 - l1 + 1) & 1)^1;
    if (arr1[mid1] < arr2[mid2]) {
    l1 = mid1 + offset;
    r2 = mid2;
    } else if (arr1[mid1] > arr2[mid2]) {
    r1 = mid1;
    l2 = mid2 + offset;
    } else {
    return arr2[mid1];
    }
    }
    return Math.min(arr1[l1], arr2[l2]);
    }
    View Code
    使用Python实现
    1)合并arr1与arr2
    2)进行排序,使用列表的sort
    3)取出中位数字即可
    View Code
  • 相关阅读:
    手贱!使用django,在数据库直接删除了表
    js中在一个函数中引用另一个函数中的函数,可以这么做
    上传下载文件方式
    阻止form提交数据,通过ajax等上传数据
    一种思路,隐藏input标签,通过label关联
    java 寻找水仙花数
    java 统计素数个数问题
    java 兔子生仔问题
    java 实现读取某个目录下指定类型的文件
    通过java 来实现对多个文件的内容合并到一个文件中
  • 原文地址:https://www.cnblogs.com/topass123/p/12602995.html
Copyright © 2011-2022 走看看