查看: 1747| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 4-Median of two sorted Array的几个灵魂发问

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
大家好,灵魂发问下关于这个问题和binary search有什么关系?
为什么把事情想的那么复杂,如果两个数组
num1:[3,5||8,9]
num2:[1,2,7 || 10,11,12]
||为各个median的位置
难道不是根据奇偶数分情况讨论,然后取两个数组前半段的最大值,或者两个数组后半段的最小值,如果两个数组和为奇数就返回median,两个数组和为偶数就返回median两个数一半吗?
为什么所有民间的算法家,都要把median分割的那么复杂?
他们要先求出两个数组和的一半+1,然后num1取一个,剩下的num2全取,然后再慢慢的++,--移动------->灵魂发问:为什么要这么做?
还有不少上来就都像事前统一过口径 都给你讲第k个元素??为什么要第k个?为什么想到第k个??

小白求解,先谢过大佬



上一篇:如何让夜猫星人早起刷题?
下一篇:求组队刷题~coding ml stats~
推荐
337845818 2019-10-22 11:31:53 | 只看该作者
全局:
[1,2,3,4,5]
[6,7,8,9,10]
回复

使用道具 举报

推荐
qxt 2019-10-22 18:02:39 | 只看该作者
全局:
简单说下我的理解。下面关于mid的计算可能不太准确,但是大体思路应该是对的。

  • 你考虑的case太少了。像楼上列出的case一样,如果一个数组的最大值小于两个数组的最小值呢?你那么分割就不行了。另外,大多数情况不可能像你想的case那样一个公式就能算出位置来,你多想几个case,研究研究。
  • 和二分的关系: 如果数组很大,一个一个查找必然比较慢,相对于二分查找来说要慢太多了。
  • 总体思路, 把握住什么是median。
根据定义,知道两个数组混合而且排序后,中位数位于一半小的和一半的的中间。高效的办法是我们不真正混合两个数组,而是试图从两个数组中找出两个点来,将两个数组分成两半,恰好左边一半都小于右边一半,而且个数满足条件。

为了方便计算,大家都用+1再除二的方式计算一半有多大,记作H。

将两个数组按照大小,分别记作S,L。
这样,知道了一半有多大,那么我们可以取较小的数组S的中点mid1,那么H-mid就是较大的数组L中应该取的点, 记作mid2。

如果恰好有:(这里的下标值可能不太正确)
s[mid1-1] < l[mid2] and l[mid2-1] < s[mid1]
说明找到的这个点,就是所求的那个位置。找出两个数组前面一半中的较大值,两个数组后面一半中的较小值,计算中位数即可(这里说的是偶数个,如果是奇数个,去前一半的较大值即可)

如果上述条件不满足,就是上面两个不等式中有任意一个不满足。
要么小数组的mid1位置太靠后了(小数组中选的点太大):
s[mid1-1]> l[mid2]
这时候,应该从小数组中更靠前的地方选取mid1。利用公式就能算出另一个数组应该取的mid2的位置。

要么小数组mid1的位置太靠前了(导致第二个数组取的数字太多,从而太大):
l[mid2-1] > s[mid1]
这时候,应该从小数组更靠后的位置找mid1.
。。
二分的应用:
上述两个情况出现后,就需要要么向前,要么向后调整mid1的位置。为了加快搜索,二分地向前向后调整。

希望我简单写的能有帮助哈,有些混乱的地方你参考你看到的解法理解一下。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表