• 题目描述

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

You may assume nums1 and nums2 cannot be both empty.

分别有大小为m和n的有序数组nums1和nums2。

求两个排序数组的中值。总的运行时复杂度应该是O(log (m+n))。

您可以假设nums1和nums2不能同时为空。

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(m+n)。但题目明确要求时间复杂度需要控制在O(log(m+n)),就必须思考优化版方法啦。

小陌目前的优化方法是用寻找第k小数(因为给出的两个数组皆有序,则k对应(m+n)/2):

每次比较两个数组的第k/2个大的数:

  1. nums1[k/2] = nums[k/2],那么这个数就是我们要找的第K小数
  2. nums1[k/2] > nums[k/2],则说明第K小数不在nums2中前k/2个元素,可排除
  3. nums1[k/2] < nums[k/2],与2同理,排除nums1中前k/2个元素

    如此操作,每次都能排除k/2的元素(递归过程中,可能会出现数组个数不到k/2的情况,并不会影响算法,从另一个数组进行补充,多取相应元素即可)。

当k=1时,找到第K小数,结束递归

  • 原码附录:
  1. 简单粗暴法
    class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int all = nums1.length+nums2.length;
    int[] result = new int[all];
    for(int i=0;i<all;i++){
    result[i] = (i<nums1.length)?nums1[i]:nums2[i-nums1.length];
    }
    Arrays.sort(result);
    return (all%2) ==1 ? result[(all-1)/2]:(double)(result[all/2]+result[all/2-1])/2;
    }
    }
  2. top k算法思想
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if((nums1.length+nums2.length)%2==0){
return (findK(nums1,0,nums1.length-1,nums2,0,nums2.length-1,(nums1.length+nums2.length)/2)
+findK(nums1,0,nums1.length-1,nums2,0,nums2.length-1,(nums1.length+nums2.length)/2+1))/2.0;
}
else{
return findK(nums1,0,nums1.length-1,nums2,0,nums2.length-1,(nums1.length+nums2.length)/2+1);
}
} public int findK(int[] nums1,int n1,int n2,int[] nums2,int m1,int m2,int k){
int i = n2 - n1 +1;
int j = m2 - m1 +1; if(i>j){
return findK(nums2,m1,m2,nums1,n1,n2,k);
}
if(i == 0){
return nums2[m1+k-1];
}
if(k == 1){
return Math.min(nums1[n1],nums2[m1]);
} int mid1 = Math.min(k/2,i);
int mid2 = k - mid1;
if(nums1[n1+mid1-1]==nums2[m1+mid2-1]){
return nums1[n1+mid1-1];
}
else if(nums1[n1+mid1-1]>nums2[m1+mid2-1]){
return findK(nums1,n1,n1+mid1-1,nums2,m1+mid2,m2,k-mid2);
}
else{
return findK(nums1,n1+mid1,n2,nums2,m1,m2+mid2-1,k-mid1);
}
}
}

以下内容为可耻的自我推销,完全可忽略(。•́ωก̀。).。

此处厚脸皮的安利小透明公众号 林夏夏

夏夏大大的英雄梦,
就是能和最喜欢的你,
分享一道算法题,
温习一个编程上易忽视小细节,
品一份书香氤氲,
道最后一句晚安ヾ(◍°∇°◍)ノ゙

Median of Two Sorted Arrays---LeetCode进阶路④的更多相关文章

  1. Median of Two Sorted Arrays LeetCode Java

    两排序好的数组,找中位数 描述There are two sorted arrays A and B of size m and n respectively. Find the median of ...

  2. 3.Median of Two Sorted Arrays Leetcode

    难度系数:5星 /*************************************************************************** 题目:有两个排好序的数组,要求 ...

  3. 4. Median of Two Sorted Arrays(topK-logk)

    4. Median of Two Sorted Arrays 题目 There are two sorted arrays nums1 and nums2 of size m and n respec ...

  4. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  5. LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)

    题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...

  6. LeetCode(3) || Median of Two Sorted Arrays

    LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...

  7. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

  8. Leetcode 4. Median of Two Sorted Arrays(二分)

    4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...

  9. leetcode第四题:Median of Two Sorted Arrays (java)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  10. LeetCode 4. Median of Two Sorted Arrays & 归并排序

    Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...

随机推荐

  1. 【BUUCTF】Ping Ping Ping

    [BUUCTF]Ping Ping Ping (命令执行绕过总结) 题目来源 收录于:BUUCTF GXYCTF2019 题目描述 提示较为明确,get方法传参127.0.0.1后结果如下 比较容易想 ...

  2. winform控件 datagridview分页功能 界面实现需要有上一页下一页等操作控件 dataGridView1 控件的数据绑定方式 如何实现分页中的数据修改然后进行保存 请列出详细例子 特别保存部分

    以下提供一个示例来说明如何在 WinForms 中实现分页功能,并在分页中实现数据修改并保存的操作. 首先,我们需要一个包含数据源的 DataGridView 控件,并添加上一页.下一页等操作控件来实 ...

  3. Easyexcel(5-自定义列宽)

    注解 @ColumnWidth @Data public class WidthAndHeightData { @ExcelProperty("字符串标题") private St ...

  4. Web前端入门第 14 问:HTML 语义化是什么?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 语义化:通俗地说,就是让机器可以理解编写出来的 HTML 代码.比如:搜索引擎.屏幕阅读器等. 非语义化写法 网 ...

  5. The selected directory is not a valid home for Go SDK

    前言 The selected directory is not a valid home for Go SDK 出现这个错误的原因是 idea 的 Go-plugin 插件,和 Go 的sdk版本不 ...

  6. laravel-echo-server 启动报错 [ioredis] Unhandled error event: ReplyError: NOAUTH Authentication required.

    可以在 .env 文件加上以下配置 LARAVEL_ECHO_SERVER_REDIS_HOST= LARAVEL_ECHO_SERVER_REDIS_PASSWORD= LARAVEL_ECHO_S ...

  7. python实现排列组合--itertools

    这是一个python自带的工具集,简单好用功能强大,能够大大提升编写代码效率. 功能不止排列组合,其他的用用加深理解了再整理. 官方文档:https://docs.python.org/zh-cn/3 ...

  8. C#反射与特性{学习笔记}

    其实这篇文章主要是想要学习反射,但是反射和特性往往是不分家的,所以也要了解一些特性相关的知识. 简单来说,继承了Attribute类的,就是特性 作用是给类或者方法打个标签 反射是在程序运行时,去读取 ...

  9. opencv的学习记录(python)

    作为最容易上手之一的语言,python拥有着大量的第三方库,这些第三方库的存在使得很多人可以专注于业务逻辑.数学逻辑而忽略繁琐的代码操作,python的opencv第三方库就是其中之一. 一.第三方库 ...

  10. Python科学计算系列7—微分方程

    1.可分离变量方程 例1:求下列微分方程法通解 先化简此方程如下: 代码如下: from sympy import * x = symbols('x') f = symbols('f', cls=Fu ...