【题意】

给两个有序数组,寻找两个数组组成后的中位数,要求时间复杂度为O(log(n+m))。

【题解】

感觉这道题想法非常妙!!

假定原数组为a,b,数组长度为lena,lenb。

那么中位数一定是第k = (lena + lenb + 1)/ 2小的数,如果是数组长度和是偶数的话就是第k = (lena + lenb + 1)/ 2小和第k = (lena + lenb + 2)/ 2小的数,所以我们可以把问题转化为求第k小的数。

然后分别对a,b找第k / 2小的数,假如a[k / 2 - 1]和b[k / 2 -1] ,如果a[k / 2 - 1 > b[k / 2 - 1],那么就说明b[k / 2 - 1]必然不是我们要找到的答案,也就是说k / 2 - 1之前的数字我们都可以排除掉,下一次b数组的开始位置变成k  / 2,然后下一次就要寻找第k = k - (k / 2)小的数(此处默认从0开始)了,然后不断递归,直到k = 1,也就是说当前指向的数就是我们要找的数,这时只要取两者最小值即可。

【代码】

 1 class Solution {
2 public:
3 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
4 int len1 = nums1.size();
5 int len2 = nums2.size();
6 int k1 = (len1 + len2 + 1) / 2;
7 int k2 = (len1 + len2 + 2) / 2;
8 double ans = (findk(0, len1 - 1, nums1, 0, len2 - 1, nums2, k1) * 1.0 + findk(0, len1 - 1, nums1, 0, len2 - 1, nums2, k2) * 1.0) / 2;
9 return ans;
10 }
11 int findk(int st1, int en1, vector<int>& nums1, int st2, int en2, vector<int>& nums2, int k)
12 {
13 int len1 = en1 - st1 + 1;
14 int len2 = en2 - st2 + 1;
15 // 使nums1的长度保持小于nums2
16 if (len1 > len2)
17 return findk(st2, en2, nums2, st1, en1, nums1, k);
18 if (len1 == 0)return nums2[st2 + k - 1];
19 if (k == 1)return min(nums1[st1], nums2[st2]);
20
21 int i = st1 + min(len1, k / 2) - 1;
22 int j = st2 + min(len2, k / 2) - 1;
23 if (nums1[i] > nums2[j])
24 return findk(st1, en1, nums1, j + 1, en2, nums2, k - (j - st2 + 1));
25 else
26 return findk(i + 1, en1, nums1, st2, en2, nums2, k - (i - st1 + 1));
27 }
28 };

【LeetCode】4. Median of Two Sorted Arrays(思维)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)

    4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二 ...

  7. Leetcode 4. Median of Two Sorted Arrays(中位数+二分答案+递归)

    4. Median of Two Sorted Arrays Hard There are two sorted arrays nums1 and nums2 of size m and n resp ...

  8. LeetCode 004 Median of Two Sorted Arrays

    题目描述:Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. F ...

  9. leetcode 4. Median of Two Sorted Arrays

    https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 and num ...

  10. leetcode之 median of two sorted arrays

    这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉.后来搜了一下leetcode的难度分布表(leetc ...

随机推荐

  1. springboot( 三)redis demo

    redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Red ...

  2. SPN在域环境中的应用

    0X01 SPN    服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称.Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联.如果 ...

  3. online QRcode generator , QRcode=== (Quick Response Code) , 二维条码,二维码,彩色二维码,图片二维码,

    online QRcode generator ,  QRcode=== (Quick Response Code)    , 二维条码,二维码,彩色二维码,图片二维码, 1 http://cli.i ...

  4. web online code editor All In One

    web online code editor All In One 在线代码编辑器 Monaco Editor 摩纳哥编辑器 ️ 22.1k The Monaco Editor is the code ...

  5. Fetch & Headers & CSRF

    Fetch & Headers & CSRF https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetc ...

  6. css & auto height & overflow: hidden;

    css & auto height & overflow: hidden; {overflow: hidden; height: 100%;} is the panacea! {溢出: ...

  7. javascript & global event & custom event

    javascript & global event & custom event new CustomEvent object let event = new CustomEvent( ...

  8. java初学者必看之构造方法详细解读

    java初学者必看之构造方法详细解读 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法. 格式 public 类名称(参数类型 参数名称){ 方法体 } 注 ...

  9. java的单例模式小知识点

    单例模式 目的 为了让一个类有且仅有一个实例 优点 只允许一个,节省空间 不用频繁创建删除,提高性能 缺点 不容易扩展 长期不使用会被系统当作垃圾回收,造成系统状态的丢失 实现 要点 防止外界随意的创 ...

  10. vue之下拉菜单Dropdown的使用

    通过组件slot来设置下拉触发的元素以及需要通过具名slot为dropdown 来设置下拉菜单.默认情况下,下拉按钮只要hover即可,无需点击也会显示下拉菜单. <el-dropdown> ...