Problem description
There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).You may assume nums1 and nums2 cannot be both empty.
Examples
1 | Example 1: |
1 | Example 2: |
Solution
二分查找的思想
中位数是用来将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。
1.两个长度相等的子集
2.一个子集中的元素总是大于另一个子集中的元素。
在这道题目中始终注意两个数组均为有序数组。
首先在任一位置 i 将A数组 划分成两个部分:
len(left_A)=i,len(right_A)=m−i.
注意:当 i = 0 时,left_A 为空集, 而当 i =m 时, right_A 为空集。
同理在任一位置 j 将B数组 划分成两个部分:
将left_A 和left_B 放入一个集合,并将 right_A 和right_B 放入另一个集合。 再把这两个新的集合分别命名为left_part 和right_part:
只要满足
- len(left_part)=len(right_part)
- max(left_part) < min(right_part)
要确保这两个条件,只需要保证:
我们可以按照以下步骤来进行二分查找保证B[j - 1] <= A[i] && A[i - 1] <= B[j]:
设 iMin = 0, iMax = m,在[iMin, iMax]中搜索
令i = (iMax + iMin) / 2, j = (m + n + 1) / 2 - i (保证len(left_part) = len(right_part) )。接下来会遇到三种情况。
- B[j - 1 ] <= A[i] && A[i - 1] <= B[j]时,找到对应i,j。
- B[j - 1] > A[i]时,i小了, iMin = i + 1
- A[i - 1] > B[j], iMax = i - 1
此外,难处理的就是边界问题,i = 0, i = m; j = 0, j = n.当 i, j 为临界值时,只需要判断B[j - 1] <= A[i] & A[i - 1] <= B[j]之中的一半即可。即i = 0时,A[i - 1]不存在,直接取B[j - 1] 即可.
如果数组长度 m + n 为奇数,直接返回结果即可,否则需要再找到右侧区域的最小值, 求平均值。
找右侧区域最小值也要注意边界啊,因为可能没有右侧区域了, i = m / j= n 时, 表明没有右侧区域,这时直接取另一半即可。如 i=m, 取 nums[j]
Code
1 | class Solution { |