前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode-4.寻找两个正序数组的中位数

Leetcode-4.寻找两个正序数组的中位数

作者头像
悠扬前奏
发布2020-05-18 15:13:05
2130
发布2020-05-18 15:13:05
举报

题目

描述

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1nums2

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1nums2 不会同时为空。

示例 1:

代码语言:javascript
复制
nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例 2:

代码语言:javascript
复制
nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

解答

思路

既然是正序数组,只需要找到位于长度一半位置的元素就好了。

代码

代码语言:javascript
复制
class Solution {
 
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 如果一个数组为空,直接返回另外一个数组的中位数
        if (nums1.length == 0) {
            if (nums2.length % 2 == 0) {
                return (nums2[nums2.length / 2 - 1] + nums2[nums2.length / 2]) / 2.0D;
            } else {
                return (nums2[nums2.length / 2] + nums2[nums2.length / 2]) / 2.0D;
            }
        }
        if (nums2.length == 0) {
            if (nums1.length % 2 == 0) {
                return (nums1[nums1.length / 2 - 1] + nums1[nums1.length / 2]) / 2.0D;
            } else {
                return (nums1[nums1.length / 2] + nums1[nums1.length / 2]) / 2.0D;
            }
        }
        // 两个数组分别往后遍历,找到位于长度一般的位置的数字,就是中位数
        int i1 = -1, i2 = -1;
        for (int i = 0; i < (nums1.length + nums2.length + 1) / 2; i++) {
            if (nums1[i1 + 1] > nums2[i2 + 1]) {
                i2++;
            } else {
                i1++;
            }
        }
        if (i1 == -1) {
            return (nums2[i2] + nums2[i2 - 1]) / 2.0D;
        } else if (i2 == -1) {
            return (nums1[i1] + nums1[i1 - 1]) / 2.0D;
        } else {
            return (nums1[i1] + nums2[i2]) / 2.0D;
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
    • 描述
    • 解答
      • 思路
        • 代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档