题目:

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)).

 Example 1:
nums1 = [1, 3]
nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4] The median is (2 + 3)/2 = 2.5

  即找两个有序数组的中位数,一开始想的是用第三个数组来把前面两个数组的值依次放进去,再直接找中间的数,但是对时间复杂度的要求是O(log (m+n)),所以不能用数组存。网上找的方法是比较两个数组中间的元素,如AB两个数组,如果A[mid]>B[mid],那中位数肯定就不在B的前半段,于是缩小了范围,即B后半段加上A,然后依次查找并缩小范围,直到找到中间的数为止。

public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m=nums1.length;
int n=nums2.length;
if((m+n)%2==0)
return (findKMax((m+n)/2,nums1,0,nums2,0)+findKMax((m+n)/2+1,nums1,0,nums2,0))/2.0;//如果是偶数
else
return findKMax((m+n)/2+1,nums1,0,nums2,0);//如果是奇数
}
public int findKMax(int k,int[] nums1,int start1,int[] nums2,int start2){
if(start1>=nums1.length)//第一个数组长度为0的话,直接返回第二个数组的中位数
return nums2[start2+k-1]; if(start2>=nums2.length)//第二个数组长度为0的话,直接返回第一个数组的中位数
return nums1[start1+k-1]; if(k==1)//k=1,即找第一个,也就是nums1或nums2中最小的
return Math.min(nums1[start1], nums2[start2]); int temp1=start1+k/2-1;
int temp2=start2+k/2-1; int mid1=temp1<nums1.length?nums1[temp1]:Integer.MAX_VALUE;//nums1没有下标为temp1的元素,如果有,就用那个元素比较,没有就用最大int
int mid2=temp2<nums2.length?nums2[temp2]:Integer.MAX_VALUE; if(mid1>=mid2)
return findKMax(k-k/2,nums1,start1,nums2,temp2+1);//如果mid1大,也就是nums1中间的数大,那么nums1前半段不会有中位数
else //从nums1后半段和nums1开始找
return findKMax(k-k/2,nums1,temp1+1,nums2,start2); } }

最新文章

  1. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
  2. Linux socket多进程服务器框架二
  3. C#操作XML文档---基础
  4. 使用jquery修改css中带有!important的样式属性
  5. Android 添加子视图(addView和setView)
  6. 执行SQL查询脚本
  7. oracle查询每个表的占用空间
  8. 导入项目 idea
  9. LeetCode21—合并两个有序链表
  10. ajax登录验证-js
  11. 工具安装(mac)
  12. React router动态加载组件-适配器模式的应用
  13. Docker部署Bytom全节点钱包
  14. MapRedcue的demo(协同过滤)
  15. apk签名的流程
  16. NHibernate初学者指南系列文章导航
  17. 不常见的javascript调试技巧
  18. rabbitMQ教程(三)一篇文章看懂rabbitMQ
  19. Swift 构造与析构
  20. windows server 2008 R2 无法启用&quot;网络发现&quot; 需要启动的服务

热门文章

  1. Java语法 示例
  2. freemarker写select组件(二十二)
  3. Linux性能分析工具top命令详解
  4. jpgraph 折线图--解决中文乱码的问题(标题和图例)
  5. C#多线程编程(6)--线程安全2 互锁构造Interlocked
  6. button 和input 的区别及在表单form中的用法
  7. Lintcode223 Palindrome Linked List solution 题解
  8. char码值对应列表大全
  9. Java项目转换成Web项目
  10. RESTful接口设计原则和优点