>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 25350 个阅读者 刷新本主题
 * 贴子主题:  谷歌面试算法题:两个排序数组的中位数 回复文章 点赞(0)  收藏  
作者:mary    发表时间:2020-03-08 21:12:16     消息  查看  搜索  好友  邮件  复制  引用

                                                                                                                                                                                                                                                                                                        

题目描述

     两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。    

说明

     中位数的定义:    
  • 这里的中位数等同于数学定义里的中位数。
  • 中位数是排序后数组的中间值。
  • 如果有数组中有n个数且n是奇数,则中位数为A[(n-1)/2]A[(n?1)/2]。
  • 如果有数组中有n个数且n是偶数,则中位数为 (A[n / 2] + A[n / 2 + 1]) / 2(A[n/2]+A[n/2+1])/2.
  • 比如:数组A=[1,2,3]的中位数是2,数组A=[1,19]的中位数是10。
               样例1        

  1.      输入:
  2.      A = [1,2,3,4,5,6]
  3.      B = [2,3,4,5]
  4.      输出: 3.5

       样例2        

  1.      输入:
  2.      A = [1,2,3]
  3.      B = [4,5]
  4.      输出: 3

题解

     分治法。时间复杂度 log(n + m)log(n+m)

         这题是 面试高频题,除了分治法外,还有二分法等其他方法来解, 算法面试高频题班免费试听,攻略还有更多大厂常考题型。        

  1.       public   class  Solution {
  2.            public  double findMedianSortedArrays ( int A[],  int B[]) {
  3.               int n = A.length + B.length;
  4.               if (n %  2 ==  0) {
  5.                   return (
  6.                      findKth(A,  0, B,  0, n /  2) +
  7.                      findKth(A,  0, B,  0, n /  2 +  1)
  8.                  ) /  2.0;
  9.              }
  10.               return findKth(A,  0, B,  0, n /  2 +  1);
  11.          }
  12.           // find kth number of two sorted array
  13.            public  static  int  findKth ( int[] A,  int startOfA,
  14.                                     int[] B,  int startOfB,
  15.                                     int k){      
  16.               if (startOfA >= A.length) {
  17.                   return B[startOfB + k -  1];
  18.              }
  19.               if (startOfB >= B.length) {
  20.                   return A[startOfA + k -  1];
  21.              }
  22.               if (k ==  1) {
  23.                   return Math.min(A[startOfA], B[startOfB]);
  24.              }
  25.               int halfKthOfA = startOfA + k /  2 -  1 < A.length
  26.                  ? A[startOfA + k /  2 -  1]
  27.                  : Integer.MAX_VALUE;
  28.               int halfKthOfB = startOfB + k /  2 -  1 < B.length
  29.                  ? B[startOfB + k /  2 -  1]
  30.                  : Integer.MAX_VALUE;
  31.               if (halfKthOfA < halfKthOfB) {
  32.                   return findKth(A, startOfA + k /  2, B, startOfB, k - k /  2);
  33.              }  else {
  34.                   return findKth(A, startOfA, B, startOfB + k /  2, k - k /  2);
  35.              }
  36.          }
  37.      }

                                                                                                        ----------------------------
原文链接:https://blog.csdn.net/JiuZhang_ninechapter/article/details/104679136

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-08 22:48:28 重新编辑]
  Java面向对象编程-->多线程(下)
  JavaWeb开发-->JSP技术详解(Ⅱ)
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->XML数据处理
  精通Spring-->
  Vue3开发-->组合(Composition)API
  Charges Convert Heads As soon as Luring ESPN Analyst Int...
  深度学习之图片压缩算法
  浅谈算法,一些感悟
  银行家算法范例
  java 通配符的应用范例, java 排序算法
  进程调度算法总结
  Java 选择排序算法
  如何面对“算法”的困惑?
  基于SQL的数据库算法研究
  Haproxy支持的调度算法
  Citrix Netscaler负载均衡算法
  基于JavaScript的Base64编码、解码算法
  微软面试题:买卖股票的最佳时机
  为什么要学数据结构?
  好书推荐:《小灰的算法之旅》
  更多...
 IPIP: 已设置保密
楼主      
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。