给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
示例 1:
nums1 = [1, 3] nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5
 
自我思路:
1.寻找出两个数组合并后中位数的位置
2.从小到大,从两个数组中取出对应位置的数
难点:
1.获取中位数的位置。本人对数字超级混乱,所以如何获取数组的中位数需要留意。
2.按元素大小,遍历两个有序数组的元素,并获取对应的中间的一个或两个数,从而获得中位数。
思路:从两个数组头部开始,比较元素大小,以A[m]和B[n]为例,则这两个长分别为m和n的数组的中位数位置应当是【(m+n-1)/2】或【(m+n-1)/2,(m+n-1)/2+1】。
(1)若A[0]>B[0],则合并后数组的第一个元素是B[0],反之则为A[0]。记为thisNum;
(2)以1中较大数继续与另一数组下一元素比较,获取thisNum。
(3)获取的thisNum是第【(m+n-1)/2】或【(m+n-1)/2,(m+n-1)/2+1】时,便记录下来求中位数。
3.从2的思路出发,可以实现算法的框架,但是会有一些细节问题:
(1)如何记录中位数的位数,是记录一个还是两个
(2)如何制定从小到大遍历数组的规则
算法实现:
 import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner; public class MedianSortedArrays {
public static void main(String[] args) throws IOException{
/*获取输入内容*/
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数组,元素间以逗号隔开:");
int[] nums1=stringToArray(input.nextLine());
System.out.println("请输入第二个数组,元素间以逗号隔开:");
int[] nums2=stringToArray(input.nextLine());
System.out.println("这两个数组的中位数是:");
Solution getMedian=new Solution();
Arrays.sort(nums1);
Arrays.sort(nums2);
double median=getMedian.findMedianSortedArrays(nums1,nums2);
System.out.println(median);
} /**
* 将获取的字符串转为数组
*/
public static int[] stringToArray(String str){
String[] strArr= str.split(",");
int[] arr=new int[strArr.length];
for(int i=0;i<strArr.length;i++){
arr[i]=Integer.parseInt(strArr[i].trim());
}
return arr;
}
} class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
double midian;
int[] index=getIndex(nums1.length+nums2.length);
midian=getMedian(nums1,nums2,index);
return midian;
} /**
* 获取中位数在组合后的数组中应当存在的位数
* @param arrLength
* @return
*/
public int[] getIndex(int arrLength){
int[] index =new int[2];
index[0]=(arrLength-1)/2;//(数组长度-1)/2为中位数在有序数组中的下标之一
if(arrLength%2==0){ //当数组长度为偶数,则中位数是(数组长度-1)/2和(数组长度-1)/2+1这两个下标对应元素的平均值
index[1]=index[0]+1;
}
return index;
} /**
* 获取中位数
* @param nums1
* @param nums2
* @param index 中位数下标对应数组[(数组长度-1)/2,(数组长度-1)/2+1]或[(数组长度-1)/2,0]
* @return
*/
public double getMedian(int[] nums1, int[] nums2,int[] index){
double sum=0; //记录中位数对应下标两个元素之和
int maxIndex; //记录中位数下标数组的较大数
double indexLength; /*此处获取中位数最大下标作为循环标记*/
if(index[1]==0){
maxIndex=index[0];
indexLength=1;
}else{
maxIndex=index[1];
indexLength=2;
} /*获取两个数组中的对应下标元素之和*/
int j=0,k=0,thisIndex=0,thisNum = 0;
while(thisIndex<=maxIndex){
if(j<nums1.length&&k<nums2.length){ //当两个数组均可遍历时
if(nums1[j]>=nums2[k]){ //比较元素大小,当某一数组元素小,便推向该数组下一个元素
thisNum=nums2[k]; //记录比较所得的较小元素,作为thisNum
k++;
}else{
thisNum=nums1[j];
j++;
}
}else{ //当有数组遍历结束,但仍未找到中位数时
if(j==nums1.length){ //遍历完的数组不再参与thisNum的记录,只进行另外一个数组的遍历
thisNum=nums2[k];
k++;
}
if(k==nums2.length){
thisNum=nums1[j];
j++;
}
} if(thisIndex==maxIndex){ //若遍历的次数达到中位数下标要求,便做和,记录中位数相关元素之和
sum+=thisNum;
}
if(index[1]!=0&&thisIndex==maxIndex-1){
sum+=thisNum;
} thisIndex++; //遍历标记
}
return sum/indexLength; //返回中位数
}
}
本方案在leetCode提交后,结果运行时间为54ms,而LeetCode最快的结果是32ms
其代码如下
 class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length, left = (m + n + 1) / 2, right = (m + n + 2) / 2;
return (findKth(nums1, nums2, left) + findKth(nums1, nums2, right)) / 2.0;
}
int findKth(int[] nums1, int[] nums2, int k) {
int m = nums1.length, n = nums2.length;
if (m > n) return findKth(nums2, nums1, k);
if (m == 0) return nums2[k - 1];
if (k == 1) return Math.min(nums1[0], nums2[0]);
int i = Math.min(m, k / 2), j = Math.min(n, k / 2);
if (nums1[i - 1] > nums2[j - 1]) {
return findKth(nums1, Arrays.copyOfRange(nums2, j, n), k - j);
} else {
return findKth(Arrays.copyOfRange(nums1, i, m), nums2, k - i);
}
}
}
 
通过比较可以看得出来,
1.对问题分析的深度和细致还不够,更偏向于暴力破解
2.对递归算法的运用是没有认识的
 
 

LeetCode#5 两个排序数组的中位数的更多相关文章

  1. LeetCode 4 - 两个排序数组的中位数 - [分治]

    题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 给定两个大小为 m 和 n 的有序数组 n ...

  2. leetcode 4.两个排序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums ...

  3. leetcode,两个排序数组的中位数

    先上题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和  ...

  4. leetcode python两个排序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ...

  5. LeetCode(4):两个排序数组的中位数

    Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...

  6. LeetCode4. 两个排序数组的中位数

    4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...

  7. 2.Median of Two Sorted Arrays (两个排序数组的中位数)

    要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...

  8. LeetCode-4. 两个排序数组的中位数(详解)

    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...

  9. JavaScript实现获取两个排序数组的中位数算法示例

    本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...

随机推荐

  1. 提高PHP编程效率的20个要点

    用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中 ...

  2. Maven的学习资料收集--(六) 构建Hibernate项目

    前面我们使用Maven构建了Struts2项目,这里我们来试一下Hibernate项目: 这里的例子,大体框架应该是正确的,但是,对于Maven的很多约定都没有掌握,估计包的命名都不是非常好,等以后, ...

  3. 12.Visual Studio 2013中的默认快捷键

    这篇大致是IDE的使用技巧,常用的也就那么几个. 我自己用的最多的是注释.取消注释.格式调整.运行测试.开始调试.断开调试.重新开始调试.删除行ctrl+L.保存.全部保存.打开资源管理器.搜索等几个 ...

  4. 大数据kafka视频教程 学习记录【B站尚硅谷 】

    视频地址: https://www.bilibili.com/video/av35354301/?p=1           2019/03/06 21:59 消息队列的内部实现: Kafka基础: ...

  5. vue3.0学习笔记(一)

    一.搭建工作环境环境 1.从node.js官网下载相应版本进行安装即可 https://nodejs.org/zh-cn/download/,安装完成后在命令行输入  node -v 如果可以查询到版 ...

  6. ActionListener 监听事件源产生的事件

    用户在窗体上对组件进行一定动作,比如鼠标点击,会产生一些相应的事件,如ActionEvents,ChangeEvents,ItemEvents等,来响应用户的鼠标点击行为.通过实现ActionList ...

  7. eclipse 中安装spring tool suite 插件100%成功率

    自己曾在学习spring时,在eclipse EE中安装springsourceTool Suite插件浪费了很多时间,不管是离线,在线还是在eclipse marketplace中安装,尝试了许多方 ...

  8. 彻底解决Android 应用方法数不能超过65K的问题

    作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik forma ...

  9. HTML、CSS、JS、JQ速查笔记

      一.HTML  1.编写html文件 a.格式 <!DOCTYPE html> <html> <head> <title>标题</title& ...

  10. linux 命令——21 find(转)

    在 使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命 令长度有限制,这样在find命令运行几分钟之后,就 ...