题目定位
难点不在中位数本身,而在于找到一个分割点:左边元素数量正确,且左半部分所有值都不大于右半部分。
关键观察
对较短数组的分割点做二分,因为较长数组的分割点会随之被唯一确定。
目标复杂度
O(log(min(m,n))) / O(1)
这题的解法思路怎么拆
1
难点不在中位数本身,而在于找到一个分割点:左边元素数量正确,且左半部分所有值都不大于右半部分。
2
对较短数组的分割点做二分,因为较长数组的分割点会随之被唯一确定。
3
先用自然语言写出单调判定条件。
4
确保搜索区间一定覆盖答案。
参考实现
Python# Generic pattern template
# Find first position where check(mid) is true
left, right = 0, n
while left < right:
mid = left + (right - left) // 2
if check(mid):
right = mid
else:
left = mid + 1
return left
常见坑点
warning
在较长数组上二分,边界会更难写。
warning
分割后某一侧为空时没有用哨兵值处理。
高频追问
你能不用代码,只用 partition 语言把思路讲清楚吗?
为什么一定优先在较短数组上二分?
继续刷相关题
先把 二分搜索 这个模式刷成体系,再去做更难变体。