Leetcode Binary Search 题解
Binary Search#
最基础的二分, 复习一下前世记忆.
class Solution { |
Search a 2D Matrix#
那我问你和上题有什么区别.
class Solution { |
Koko Eating Bananas#
一亿个小时吃了一万亿根香蕉的不灭大胃袋.
直接在答案取值范围内二分查找即可.
class Solution { |
Find Minimum In Rotated Sorted Array#
二分查找拐点在哪里即可. 注意一般情况下比较 mid 和 right 更为恰当, 否则无法区分「拐点在右边」和「没有拐点 (没有旋转)」的情况, 但我这里最开始用 if 把没有旋转的情况直接过掉了, 事后看题解才发现. 有一说一我写得挺唐的.
class Solution { |
Search In Rotated Sorted Array#
比较笨的方法是二分查找到拐点在哪, 然后用取模把数组映射成未旋转的情况, 然后再二分一次.
class Solution { |
比较优雅的方法是, 注意到把数组分成左右两段, 一定有一段是有序的:

这样一次二分就可以写完.
Find Minimum In Rotated Sorted Array II#
主要问题在于 mid 和 right 所对应的值相等时无法区分拐点在左边还是右边, 但注意到此时把 right - 1 一定不会造成影响.
另外这里 right = mid 不能写成 right = mid - 1 , 因为这样会跳过 mid 为最小值的情况.
class Solution { |
Median of Two Sorted Arrays#
写得我很痛苦的一道题, 本质是找到数组里第 k 大的数, 每次二分考虑两个数组的前 k/2 个元素, 筛掉更小的 k/2 个二分即可.
class Solution { |
更好的方法是, 找中位数实际上是找一个分割, 如果在 nums1 的 i 处, nums2 的 j 处切割, j 可以通过 i 算出, 只需满足 nums1[i-1] <= nums2[j] 且 nums2[j-1] <= nums1[i], 二分查找 i 即可.
并且不妨设 nums1 比 nums2 短, 否则交换两个数组, 可以明显简化代码.