题目英文

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.

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

题目中文

给定两个大小为 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

算法实现

实现方式一

public class Solution {public double FindMedianSortedArrays(int[] nums1, int[] nums2) {int len1 = nums1.Length;int len2 = nums2.Length;int len = len1 + len2;int[] nums = new int[len];Array.Copy(nums1, nums, len1);Array.Copy(nums2, 0, nums, len1, len2);Array.Sort(nums);if (len%2 == 0){return (nums[len/2] + nums[len/2 - 1])*0.5;}return nums[len/2];        }
}

实现方式二

由于题目要求时间复杂度为 O(log(m + n)),所以不能从两个有序数组的首尾挨个遍历来找到中位数(复杂度 O(m + n));而是要通过二分策略,通过每次比较,能够直接按比例的刷掉一组数字,最后找到中位数(复杂度 O(log(m + n)))。

中位数:用来将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。

nums1: [a1,a2,a3,...am]
nums2: [b1,b2,b3,...bn][nums1[:i],nums2[:j] | nums1[i:], nums2[j:]]nums1 取 i 个数的左半边
nums2 取 j = (m+n+1)/2 - i 的左半边

只要保证左右两边 个数 相同,中位数就在 | 这个边界旁边产生,从而可以利用二分法找到合适的 i。

public class Solution {public double FindMedianSortedArrays(int[] nums1, int[] nums2) {int m = nums1.Length;int n = nums2.Length;if (m > n)return FindMedianSortedArrays(nums2, nums1);int k = (m + n + 1)/2;int left = 0;int right = m;while (left < right){int i = (left + right)/2;int j = k - i;if (nums1[i] < nums2[j - 1])left = i + 1;elseright = i;}int m1 = left;int m2 = k - left;int c1 = Math.Max(m1 == 0 ? int.MinValue : nums1[m1 - 1],m2 == 0 ? int.MinValue : nums2[m2 - 1]);if ((m + n)%2 == 1)return c1;int c2 = Math.Min(m1 == m ? int.MaxValue : nums1[m1],m2 == n ? int.MaxValue : nums2[m2]);return (c1 + c2)*0.5;        }
}

实验结果

实现方式一

  • 状态:通过
  • 2085 / 2085 个通过测试用例
  • 执行用时: 188 ms, 在所有 C# 提交中击败了 72.14% 的用户
  • 内存消耗: 26.9 MB, 在所有 C# 提交中击败了 5.05% 的用户

实现方式二

  • 状态:通过
  • 2085 / 2085 个通过测试用例
  • 执行用时: 160 ms, 在所有 C# 提交中击败了 99.18% 的用户
  • 内存消耗: 26.8 MB, 在所有 C# 提交中击败了 5.05% 的用户


相关图文

  • LeetCode实战:两数之和
  • LeetCode实战:三数之和
  • LeetCode实战:缺失的第一个正数
  • LeetCode实战:求众数
  • LeetCode实战:快乐数
  • LeetCode实战:删除链表的倒数第N个节点
  • LeetCode实战:合并两个有序链表
  • LeetCode实战:合并K个排序链表
  • LeetCode实战:两两交换链表中的节点
  • LeetCode实战:旋转链表
  • LeetCode实战:环形链表
  • LeetCode实战:有效的括号
  • LeetCode实战:最长有效括号
  • LeetCode实战:逆波兰表达式求值
  • LeetCode实战:设计循环双端队列
  • LeetCode实战:爬楼梯
  • LeetCode实战:反转字符串
  • LeetCode实战:翻转字符串里的单词
  • LeetCode实战:相同的树
  • LeetCode实战:对称二叉树
  • LeetCode实战:二叉树的最大深度
  • LeetCode实战:将有序数组转换为二叉搜索树
  • LeetCode实战:搜索二维矩阵
  • LeetCode实战:x 的平方根

LeetCode实战:寻找两个有序数组的中位数相关推荐

  1. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

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

  2. leetcode 4. 寻找两个有序数组的中位数,c语言

    leetcode上第四道题,如下. 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假 ...

  3. LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

    文章目录 1. 题目 2. 解题 2.1 合并数组 2.2 优化2.1解法,双指针 2.3 二分法(找第k个数) 2.4 切分法 1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  4. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

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

  5. Leetcode(4)寻找两个有序数组的中位数

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

  6. LeetCode 4.寻找两个有序数组的中位数

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

  7. leetcode 4 --- 寻找两个有序数组的中位数

    1 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:设计一个时间复杂度为 O(log (m+n)) 的算法. 2 解 ...

  8. [leetcode] 4. 寻找两个有序数组的中位数

    官方题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu- ...

  9. 20191016:(leetcode习题)寻找两个有序数组的中位数

    寻找两个有序数组的中位数 题目 大致思路 代码实现 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log( ...

  10. LeetCode(Python实现)—寻找两个有序数组的中位数

    4.寻找两个有序数组的中位数 题目大意 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). ...

最新文章

  1. loganalyzer部署文档-(第一部分)
  2. 如何在两个目录中删除其中一个目录中同名文件
  3. git-fork下来的项目(拷贝到本地 根据原来的库更新)
  4. MySQL -A不预读数据库信息(use dbname 更快)
  5. Ribbon-2通过代码自定义配置ribbon
  6. 明天面腾讯,我刷了这71道面试题...
  7. 比起掉头发,我更怕掉队
  8. php依赖注入解决什么问题,php – 了解依赖注入的问题
  9. 详解.NET IL代码(一)
  10. java的property配置文件的用法
  11. Ansi,UTF8,Unicode编码
  12. Security+ 学习笔记28 云计算
  13. Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
  14. Guava的Optional的操作
  15. atitit 高扩展性解决方案.docx
  16. STM32LCD液晶屏显示二值图片
  17. 阐述商务礼仪的重要性
  18. 小说作者推荐:耳东兔子合集
  19. Lottie动画(二)Lottie动画制作
  20. css鼠标划过时的一些小特效

热门文章

  1. 悉尼大学计算机研究生学制,悉尼大学研究生学制
  2. 白盒测试--基本路径测试法
  3. (C++)A+B 输入输出练习V 输入的第一行是一个正数N,表示后面有N行。每一行的第一个数是M,表示本行后面还有M个数。
  4. IDEA IntelliJ 如何快速查看一个类里面包含哪些方法
  5. editor修改样式 vue_vue+element-ui项目搭建实战
  6. Java基础学习总结(3)——抽象类
  7. 想要确保架构目标达成?适合度函数了解一下
  8. 存储过程和存储函数初步
  9. Android重绘ListView高度
  10. Linux下SVN服务器支持Apache的http和svnserve独立服务器