【算法】【算法杂谈】相同长度的排序数组求上中位数

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
给定两个长度相同的排序数组,arr1和arr2,求两个长度相同的排序数组的上中位数

解决方案

原问题
1、首先确认两个数组的长度是奇数还是偶数
2、如果是奇数,则以中间值为分割,arr1和arr2的一半长度都是相等的,如 长度是5,midindex是2,arr1的左边包含mid总长度和右边包含mid总长度相同,都是3
3、但是如果是偶数,如长度4,则上中位数位置为1,左边一半长度为2,右边一半长度为3,左右长度不相同,则截取时需要特殊处理
4、现在分别取arr1和arr2的中间值,mid1和mid2,
· 如果arr1[mid1] == arr2[mid2],那么无须比较,上中位数直接就是arr[mid1]或者arr[mid2]
· 如果arr1[mid1] < arr2[mid2],那么arr1的右边被截取,arr2的左边被截取,奇数情况正常截取,偶数情况小的那一方不能包含mid值,也就是arr1只能取 [mid1+1 … len-1]
· 如果arr1[mid1] > arr2[mid2],那么arr1的左边被截取,arr2的右边被截取,奇数情况正常截取,偶数情况小的那一方不能包含mid值,也就是arr2只能取 [mid1+1 … len-1]

代码编写

java语言版本

原问题:
原问题:

   /**
     * 二轮测试:求相同长度的排序数组的上中位数
     * @param arr1
     * @param arr2
     * @return
     */
    public static int getUpMedianCp1(int[] arr1, int[] arr2){
        if (arr1 == null || arr2 == null || arr1.length != arr2.length){
            throw new RuntimeException("非法array");
        }
        int left1 = 0;
        int left2 = 0;
        int right1 = arr1.length-1;
        int right2 = arr2.length-1;
        while (left1 < right1) {
            // 求终点
            int mid1 = (left1 + right1)/2;
            int mid2 = (left2 + right2)/2;
            if (arr1[mid1] == arr2[mid2]) {
                return arr1[mid1];
            }else {
                // 判断当前数组长度是奇数还是偶数
                int offset = ((right1 - left1 + 1) & 1) ^ 1;
                if (arr1[mid1] < arr2[mid2]) {
                    left1 = mid1 + offset;
                    right2 = mid2;
                }else {
                    right1 = mid1;
                    left2 = mid2 + offset;
                }
            }
        }
        return Math.min(arr1[left1], arr1[left2]);
    }

    public static void main(String[] args) {
        System.out.println(getUpMedianCp1(new int[]{3,4,5,6}, new int[]{1,2,3,4}));
    }

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

这道题比较简单,我记得面试的时候被问到过这道题,那个时候没有刷算法,思路很容易想到,但是细节处理方面,比如奇数和偶数的位移处理容易出错,如果理不清楚容易陷进去无法快速完成算法,最后可能将代码写的思路混乱。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给[email protected]
再次感谢左大神对我算法的指点迷津!

你可能感兴趣的:(阅读随笔,算法,java专栏,算法,java,开发语言)