1. 算法问题概述
今天我想和大家分享两个经典的二分查找算法问题:寻找两个正序数组的中位数和寻找旋转排序数组中的最小值。这两个问题都来自LeetCode题库,分别是第114题和第153题。作为算法工程师日常工作中经常遇到的典型问题,它们不仅考察我们对二分查找的理解,也考验我们处理边界条件的能力。
这两个问题看似简单,但实际解决起来有不少需要注意的细节。特别是第一个问题,需要在两个有序数组中找到中位数,这比在单个数组中查找要复杂得多。第二个问题虽然相对简单,但如果不理解旋转数组的特性,也很容易陷入误区。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 寻找两个正序数组的中位数
2.1 问题分析与思路
给定两个大小分别为m和n的正序(升序)数组nums1和nums2,找出这两个数组的中位数。要求算法的时间复杂度为O(log(min(m,n)))。
这个问题最直观的解法是将两个数组合并后排序,然后直接取中位数。但这样时间复杂度是O(m+n),不符合要求。我们需要更高效的解法。
核心思路是利用二分查找在两个数组中找到合适的分割线。具体来说,我们需要找到i和j,使得:
- i + j = (m + n + 1)/2
- nums1[i-1] <= nums2[j]
- nums2[j-1] <= nums1[i]
这样中位数就可以通过分割线两侧的元素计算得出。
2.2 算法实现详解
让我们仔细分析代码实现:
java复制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 iMin = 0, iMax = m;
while(iMin <= iMax){
int i = iMin + (iMax - iMin)/2;
int j = (m + n + 1)
