题解 | #在两个长度相等的排序数组中找到上中位数#

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

http://www.nowcoder.com/practice/6fbe70f3a51d44fa9395cfc49694404f

不明白 哈哈 但用手画一画 就是这个规律:
题解二:二分
题解思路:首先两个数组都为N且有序,那么两个数组中间值两边数的个数是相同(长度为奇数)的或者一边多一个(长度为偶数),所以要考虑长度的奇偶。
用mid1表示arr1中值index,mid2表示arr2中值index

长度为奇数
①arr1[mid1] > arr2[mid2]
arr1[mid1] 肯定大于 arr2[0:mid2) , arr2[mid2] 肯定小于 arr1(mid1:right] , 且 arr2[0:mid2) 与 arr1 (mid1:right] 长度相同,所以要是将 arr1 与 arr2 合并看出一个大数组,它们位于这个数组的两端。
所以中位数肯定在 arr1[0:mid1] 和 arr2[mid2:right] 中;
②arr1[mid1] < arr2[mid2]
同理: 中位数在 arr1[mid1:right] 与 arr2[0:mid2] 中;
③arr1[mid1] == arr2[mid2]
表明找到中位数。
长度为偶数
①arr1[mid1] > arr2[mid2]:
这时如果向下取整,对于 arr(mid:right] 长度要比 arr[0:mid) 多一个数;
所以 arr1 会比 arr2 多缩减一个数,因此中位数在 arr1[0:mid1] 与 arr2[mid2+1,right] 中;
②arr1[mid1] < arr2[mid2]:
同理: 中位数在 arr1[mid1+1,right] 与 arr2[0:mid2];
③ arr1[mid1] = arr2[mid2]
表明找到中位数。
图示:
图片说明

复杂度分析:
时间复杂度: : 每次都缩减一半的范围
空间复杂度: : 没有申请额外空间

import java.util.*;


public class Solution {
    /**
     * find median in two sorted array
     * @param arr1 int整型一维数组 the array1
     * @param arr2 int整型一维数组 the array2
     * @return int整型
     */
    public int findMedianinTwoSortedAray (int[] arr1, int[] arr2) {

        if(arr1.length == 1) {
            return Math.min(arr1[0],arr2[0]);
        }

        int left1 = 0;
        int right1 = arr1.length -1;

        int left2 = 0;
        int right2 = arr2.length -1;

        while (left1 < right1) {

            int mid1 = left1 + (right1 - left1) / 2;
            int mid2 = left2 + (right2 - left2) / 2;

            //如果是偶数,那么有一个arr多缩减了一个数 注意:这里不能写成int jiOu = (arr1.length % 2 == 0 ? 1 : 0); 因为每次2分后 数组左右指针都是变化的 可能一会是奇数 一会是偶数
            int jiOu = ((right1 - left1 + 1) % 2 == 0 ? 1 : 0);

            //相等表明找到中位数
            if (arr1[mid1] == arr2[mid2]) {
                return arr1[mid1];
            } else if (arr1[mid1] > arr2[mid2]) {
                //判断是不是要多一移一位,偶数需要  arr2[mid2+cr: right2] ---arr1[0:mid1]
                left2 = mid2 + jiOu;
                right1 = mid1;
            } else {
                //arr1[mid1+cr: right1] ---arr2[0:mid2]
                left1 = mid1 + jiOu;
                right2 = mid2;
            }
        }

        //若两数组中位数不相等,最后返回最小的为上中位数
        return Math.min(arr1[left1], arr2[left2]);
    }
}
刷刷题 文章被收录于专栏

刷刷题 活跃活跃脑细胞

全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司8个岗位
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 18:05
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务