zoukankan      html  css  js  c++  java
  • Q4:Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays

    官方的链接:4. Median of Two Sorted Arrays

    Description :

    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    Example1:


    nums1 = [1, 3]

    nums2 = [2]

    The median is 2.0


    Example2:


    nums1 = [1, 2]
    nums2 = [3, 4]

    The median is (2 + 3)/2 = 2.5


    问题描述

    给定长度分别为m和n的两个排序数组nums1和nums2,在时间复杂度O(log (m+n))内算出数组的中位数

    思路

    两个有序数组的中位数和Top K问题类似。这里从小到大直接定位第k个,简单理解为从nums1中获取第i个,而从nums2中获取第j=k-i个,其中i=0~k。当定位到nums[i-1]<=nums2[j]和nums[j-1]<=nums[i]即完成,当然还有边界问题。

    把中位数也当作是top k问题,最后进行奇偶判断。详情可参考这里Share my O(log(min(m,n)) solution with explanation,代码也是借鉴的。

    值得注意的是几个边界判断问题,比如i为0或者m,j为0或者n。

    [github-here]

     1 public class Q4_MedianOfTwoSortedArrays {
     2     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
     3 
     4         int m = nums1.length;
     5         int n = nums2.length;
     6         // make sure that m <= n
     7         if (m > n) {
     8             return findMedianSortedArrays(nums2, nums1);
     9         }
    10         // n>=m,i = 0 ~ m,so j = (m + n + 1) / 2 -i > 0.
    11         int i = 0, j = 0, imax = m, imin = 0, halfLen = (m + n + 1) / 2;
    12         int maxLeft = 0, minRight = 0;
    13         while (imin <= imax) {
    14             i = (imin + imax) / 2;
    15             j = halfLen - i;
    16             if (i < m && nums2[j - 1] > nums1[i]) {
    17                 imin = i + 1;
    18             } else if (i > 0 && nums1[i - 1] > nums2[j]) {
    19                 imax = i - 1;
    20             } else {
    21                 if (i == 0) {
    22                     //the target is in nums2
    23                     maxLeft = nums2[j - 1];
    24                 } else if (j == 0) {
    25                     //the target is in nums1
    26                     maxLeft =  nums1[i - 1];
    27                 } else {
    28                     maxLeft = Math.max(nums1[i - 1], nums2[j - 1]);
    29                 }
    30                 break;
    31             }
    32         }
    33         //odd
    34         if ((m + n) % 2 == 1) {
    35             return (double)maxLeft;
    36         }
    37         //even
    38         if (i == m) {
    39             //nums1 is out of index m
    40             minRight = nums2[j];
    41         } else if (j == n) {
    42             //nums2 is out of index n
    43             minRight = nums1[i];
    44         } else {
    45             //others
    46             minRight = Math.min(nums1[i], nums2[j]);
    47         }
    48         return (double) (maxLeft + minRight) / 2;
    49     }
    50 
    51     public static void main(String[] args) {
    52         new Q4_MedianOfTwoSortedArrays().findMedianSortedArrays(new int[] { 1, 3 }, new int[] { 2 });
    53 
    54     }
    55 }
  • 相关阅读:
    T-SQL常用的函数
    webservice和wcf和web.api简单介绍
    c#索引器
    在eclipse中使用maven构建spring cloud微服务
    maven项目报错maven-resources-plugin:2.7 or one of its dependencies could not be resolved
    使用maven创建工程报错Could not resolve archetype org.apache.maven.archetype
    eclipse配置maven
    最新省市区json数据
    ORA-01461: can bind a LONG value only for insert into a LONG column
    js验证强密码 大小写字母数字字符四选三 且大于8位
  • 原文地址:https://www.cnblogs.com/wpbxin/p/8654941.html
Copyright © 2011-2022 走看看